├── apps
├── employ
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── apps.py
│ ├── admin.py
│ ├── filters.py
│ ├── forms.py
│ ├── models.py
│ └── views.py
├── onu
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── filters.py
│ ├── Templates
│ │ └── onu
│ │ │ ├── onu_form.html
│ │ │ ├── onu_delete_form.html
│ │ │ └── onus.html
│ ├── urls.py
│ ├── models.py
│ └── views.py
├── pop
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── filters.py
│ ├── Templates
│ │ └── pop
│ │ │ ├── pop_form.html
│ │ │ ├── pop_delete_form.html
│ │ │ └── pops.html
│ ├── urls.py
│ ├── models.py
│ └── views.py
├── tasks
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── apps.py
│ ├── admin.py
│ ├── filters.py
│ ├── Templates
│ │ ├── tasks
│ │ │ ├── task_form.html
│ │ │ ├── tasks_delete.html
│ │ │ └── tasks.html
│ │ └── taskCategory
│ │ │ ├── tasksCategory_form.html
│ │ │ ├── tasksCategory_delete.html
│ │ │ └── taskCategory.html
│ ├── forms.py
│ ├── urls.py
│ ├── models.py
│ └── views.py
├── users
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── apps.py
│ ├── decorator.py
│ ├── templates
│ │ ├── auth
│ │ │ ├── createUser.html
│ │ │ ├── user_form.html
│ │ │ ├── login.html
│ │ │ └── users.html
│ │ └── users
│ │ │ └── profile.html
│ ├── signals.py
│ ├── urls.py
│ ├── admin.py
│ ├── static
│ │ └── login.css
│ ├── views.py
│ ├── forms.py
│ └── models.py
├── accountants
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── apps.py
│ ├── admin.py
│ ├── templates
│ │ └── dashboard
│ │ │ ├── owner
│ │ │ ├── owner_form.html
│ │ │ ├── owner_delete_confirm.html
│ │ │ └── owner.html
│ │ │ ├── employ
│ │ │ ├── employ_form.html
│ │ │ ├── employ_category_form.html
│ │ │ ├── employ_delete_confirm.html
│ │ │ ├── employ_category_delete_form.html
│ │ │ ├── employ_category.html
│ │ │ └── employ.html
│ │ │ ├── invest
│ │ │ ├── invest_form.html
│ │ │ ├── invest_delete_confirm.html
│ │ │ └── invest.html
│ │ │ ├── earnings
│ │ │ ├── earning_form.html
│ │ │ ├── earn_delete_confirm.html
│ │ │ └── earnings.html
│ │ │ ├── profile
│ │ │ └── profile_form.html
│ │ │ ├── commission
│ │ │ └── commission_form.html
│ │ │ ├── baseDashboard.html
│ │ │ └── dashboard.html
│ ├── decorator.py
│ ├── context_processors.py
│ ├── filters.py
│ ├── forms.py
│ ├── static
│ │ └── dashboard
│ │ │ └── baseDashboard.css
│ ├── models.py
│ ├── urls.py
│ └── views.py
├── clients
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── admin.py
│ ├── apps.py
│ ├── filters.py
│ ├── static
│ │ └── clients
│ │ │ └── clients.css
│ ├── forms.py
│ ├── Templates
│ │ └── clients
│ │ │ ├── create_client.html
│ │ │ ├── clients_delete.html
│ │ │ └── clients.html
│ ├── urls.py
│ ├── models.py
│ └── views.py
├── packages
│ ├── __init__.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── tests.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── models.py
│ ├── templates
│ │ └── packages
│ │ │ ├── packages_form.html
│ │ │ ├── packages_delete.html
│ │ │ └── packages.html
│ ├── urls.py
│ └── views.py
└── warehouse
│ ├── __init__.py
│ ├── migrations
│ ├── __init__.py
│ └── 0001_initial.py
│ ├── static
│ └── warehouse
│ │ ├── category.css
│ │ └── warehouse.css
│ ├── tests.py
│ ├── apps.py
│ ├── admin.py
│ ├── forms.py
│ ├── filters.py
│ ├── templates
│ └── warehouse
│ │ ├── category_delete_confirm.html
│ │ ├── create_category.html
│ │ ├── warehouse_create.html
│ │ ├── warehouse_delete_confirm.html
│ │ ├── category.html
│ │ └── warehouse.html
│ ├── urls.py
│ ├── models.py
│ └── views.py
├── isp_management
├── __init__.py
├── __pycache__
│ ├── urls.cpython-310.pyc
│ ├── wsgi.cpython-310.pyc
│ ├── __init__.cpython-310.pyc
│ └── settings.cpython-310.pyc
├── asgi.py
├── wsgi.py
├── urls.py
└── settings.py
├── .gitignore
├── requirements.txt
├── README.md
├── static
└── base.css
├── manage.py
└── templates
└── base.html
/apps/employ/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/onu/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/pop/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/tasks/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/users/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/accountants/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/clients/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/packages/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/warehouse/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/isp_management/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/onu/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/pop/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/tasks/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/users/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/clients/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/employ/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/packages/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/warehouse/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/accountants/migrations/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/warehouse/static/warehouse/category.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/warehouse/static/warehouse/warehouse.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/apps/clients/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/employ/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/onu/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/pop/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/tasks/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/users/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/accountants/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/packages/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/apps/warehouse/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /isp-env
2 | /db.sqlite3
3 | /.env
4 | *.log
5 | *.pot
6 | *.pyc
7 | __pycache__/
8 | /Media
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sabbir-mahmud/radius_server_isp/HEAD/requirements.txt
--------------------------------------------------------------------------------
/apps/onu/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Onu
4 |
5 | # Register your models here.
6 | admin.site.register(Onu)
7 |
--------------------------------------------------------------------------------
/apps/pop/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Pop
4 |
5 | # Register your models here.
6 | admin.site.register(Pop)
7 |
--------------------------------------------------------------------------------
/isp_management/__pycache__/urls.cpython-310.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sabbir-mahmud/radius_server_isp/HEAD/isp_management/__pycache__/urls.cpython-310.pyc
--------------------------------------------------------------------------------
/isp_management/__pycache__/wsgi.cpython-310.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sabbir-mahmud/radius_server_isp/HEAD/isp_management/__pycache__/wsgi.cpython-310.pyc
--------------------------------------------------------------------------------
/apps/clients/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Clients
4 |
5 | # Register your models here.
6 | admin.site.register(Clients)
7 |
--------------------------------------------------------------------------------
/apps/packages/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Package
4 |
5 | # Register your models here.
6 | admin.site.register(Package)
7 |
--------------------------------------------------------------------------------
/isp_management/__pycache__/__init__.cpython-310.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sabbir-mahmud/radius_server_isp/HEAD/isp_management/__pycache__/__init__.cpython-310.pyc
--------------------------------------------------------------------------------
/isp_management/__pycache__/settings.cpython-310.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sabbir-mahmud/radius_server_isp/HEAD/isp_management/__pycache__/settings.cpython-310.pyc
--------------------------------------------------------------------------------
/apps/onu/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class OnuConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.onu'
7 |
--------------------------------------------------------------------------------
/apps/pop/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class PopConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.pop'
7 |
--------------------------------------------------------------------------------
/apps/employ/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class EmployConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.employ'
7 |
--------------------------------------------------------------------------------
/apps/tasks/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class TasksConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.tasks'
7 |
--------------------------------------------------------------------------------
/apps/clients/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class ClientsConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.clients'
7 |
--------------------------------------------------------------------------------
/apps/packages/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class PackagesConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.packages'
7 |
--------------------------------------------------------------------------------
/apps/warehouse/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class WarehouseConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.warehouse'
7 |
--------------------------------------------------------------------------------
/apps/accountants/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class AccountantsConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.accountants'
7 |
--------------------------------------------------------------------------------
/apps/employ/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Employ, EmployCategory
4 |
5 | # Register your models here.
6 | admin.site.register(EmployCategory)
7 | admin.site.register(Employ)
8 |
--------------------------------------------------------------------------------
/apps/tasks/admin.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib import admin
3 |
4 | from .models import TaskCategory, Tasks
5 |
6 | # Register your models here.
7 | admin.site.register(TaskCategory)
8 | admin.site.register(Tasks)
9 |
--------------------------------------------------------------------------------
/apps/onu/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.forms import ModelForm
3 |
4 | from .models import Onu
5 |
6 |
7 | #* Onu Form
8 | class OnuForm(ModelForm):
9 | class Meta:
10 | model = Onu
11 | fields = '__all__'
12 |
--------------------------------------------------------------------------------
/apps/pop/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.forms import ModelForm
3 |
4 | from .models import Pop
5 |
6 |
7 | #* PopForm
8 | class PopForm(ModelForm):
9 | class Meta:
10 | model = Pop
11 | fields = '__all__'
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # isp-management-full-system
2 | simple Radius server for Internet Service Providers (ISPs). With this web application,
3 | ISPs can automate tasks such as bill collection, support ticket management, and device tracking
4 |
--------------------------------------------------------------------------------
/apps/pop/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django_filters import FilterSet
3 |
4 | from .models import Pop
5 |
6 |
7 | #* PopFilter
8 | class PopFilter(FilterSet):
9 | class Meta:
10 | model = Pop
11 | fields = ['name']
12 |
--------------------------------------------------------------------------------
/apps/warehouse/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Warehouse, WarehouseCategory
4 |
5 | # Register your models here.
6 | admin.site.register(WarehouseCategory)
7 | admin.site.register(Warehouse)
8 |
--------------------------------------------------------------------------------
/apps/onu/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django_filters import FilterSet
3 |
4 | from .models import Onu
5 |
6 |
7 | #* Onu Filter
8 | class OnuFilter(FilterSet):
9 | class Meta:
10 | model = Onu
11 | fields = ['mac','status']
12 |
--------------------------------------------------------------------------------
/apps/packages/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django import forms
3 |
4 | from .models import Package
5 |
6 |
7 | # Clients Forms
8 | class PackagesForm(forms.ModelForm):
9 | class Meta:
10 | model = Package
11 | fields = '__all__'
--------------------------------------------------------------------------------
/apps/tasks/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django_filters import FilterSet
3 |
4 | from .models import Tasks
5 |
6 |
7 | #* task filter
8 | class TaskFilter(FilterSet):
9 | class Meta:
10 | model = Tasks
11 | fields = ['task_token']
12 |
--------------------------------------------------------------------------------
/apps/clients/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django_filters import FilterSet
3 |
4 | from .models import Clients
5 |
6 |
7 | # clients filter
8 | class ClientFilter(FilterSet):
9 | class Meta:
10 | model = Clients
11 | fields = ['phone','ip']
12 |
--------------------------------------------------------------------------------
/apps/employ/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django_filters import FilterSet
3 |
4 | from .models import Employ
5 |
6 |
7 | # Employ Filter
8 | class EmployFilter(FilterSet):
9 | class Meta:
10 | model = Employ
11 | fields = ['phone','name']
12 |
--------------------------------------------------------------------------------
/apps/clients/static/clients/clients.css:
--------------------------------------------------------------------------------
1 | .form {
2 | margin-left: 3.5%;
3 | }
4 |
5 | .form input {
6 | width: 46%;
7 | margin-bottom: 1%;
8 | }
9 |
10 | .form select {
11 | margin-bottom: 1%;
12 | width: 46%;
13 | padding: 2px;
14 | }
--------------------------------------------------------------------------------
/apps/users/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class UsersConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'apps.users'
7 |
8 | def ready(self):
9 | import apps.users.signals
10 |
--------------------------------------------------------------------------------
/apps/clients/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django import forms
3 |
4 | from .models import Clients
5 |
6 |
7 | # Clients Forms
8 | class ClientsForm(forms.ModelForm):
9 | class Meta:
10 | model = Clients
11 | fields = '__all__'
12 | exclude = ['client_id']
13 |
--------------------------------------------------------------------------------
/apps/packages/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 | # Create your models here.
4 | # Packages Model
5 |
6 | class Package(models.Model):
7 | name = models.CharField(max_length=245)
8 | speed = models.IntegerField()
9 | price = models.FloatField()
10 |
11 | def __str__(self):
12 | return self.name
13 |
--------------------------------------------------------------------------------
/apps/users/decorator.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.shortcuts import redirect
3 |
4 |
5 | def auth_user(view_func):
6 | def wrapper_func(request, *args, **kwargs):
7 | if request.user.is_authenticated:
8 | return redirect('dashboard:dashboard')
9 |
10 | else:
11 | return view_func(request, *args, **kwargs)
12 |
13 | return wrapper_func
--------------------------------------------------------------------------------
/apps/accountants/admin.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib import admin
3 |
4 | from .models import Commission, CompanyProfile, Earning, Invest, Owner
5 |
6 | # Register your models here.
7 | admin.site.register(CompanyProfile)
8 | admin.site.register(Owner)
9 | admin.site.register(Invest)
10 | admin.site.register(Earning)
11 | admin.site.register(Commission)
12 |
--------------------------------------------------------------------------------
/apps/onu/Templates/onu/onu_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}onu form{% endblock title %}
4 | {% block dashboard %}
5 |
onu forms
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/pop/Templates/pop/pop_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}pop form{% endblock title %}
4 | {% block dashboard %}
5 | pop form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/static/base.css:
--------------------------------------------------------------------------------
1 | /* message modal design */
2 |
3 | .toast:not(.show) {
4 | display: block;
5 | position: absolute;
6 | top: 10%;
7 | right: 1%;
8 | }
9 |
10 | /* delete confim form design */
11 | form.delete-form {
12 | width: 50%;
13 | height: 50%;
14 | box-shadow: 0px 1px 2px 1px;
15 | padding: 39px 21px;
16 | border-radius: 7px;
17 | margin-left: 25%;
18 | margin-top: 5%;
19 | }
--------------------------------------------------------------------------------
/apps/tasks/Templates/tasks/task_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}task form{% endblock title %}
4 | {% block dashboard %}
5 | Task Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/employ/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.forms import ModelForm
3 |
4 | from .models import Employ, EmployCategory
5 |
6 |
7 | # Employ Category Form
8 | class EmployCategoryForm(ModelForm):
9 | class Meta:
10 | model = EmployCategory
11 | fields = '__all__'
12 |
13 |
14 | # Employ Form
15 | class EmployForm(ModelForm):
16 | class Meta:
17 | model = Employ
18 | fields = '__all__'
19 |
--------------------------------------------------------------------------------
/apps/pop/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | app_name = 'pop'
7 |
8 | urlpatterns = [
9 | path('', views.PopList.as_view(), name='pop'),
10 | path('create', views.CreatePop.as_view(), name='create'),
11 | path('update/', views.UpdatePop.as_view(), name='update'),
12 | path('delete/', views.DeletePop.as_view(), name='delete'),
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/owner/owner_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/owner/owner.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}owner form{% endblock title %}
4 | {% block dashboard %}
5 | Owner Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/onu/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | app_name = 'onu'
7 |
8 | urlpatterns = [
9 | path('', views.OnuList.as_view(), name='onus'),
10 | path('create', views.OnuCreate.as_view(), name='create'),
11 | path('update/', views.OnuUpdate.as_view(), name='update'),
12 | path('delete/', views.OnuDelete.as_view(), name='delete'),
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/employ/employ.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}employ form{% endblock title %}
4 | {% block dashboard %}
5 | Employ Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/invest/invest_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/invest/invest.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}invest form{% endblock title %}
4 | {% block dashboard %}
5 | Invest Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/pop/models.py:
--------------------------------------------------------------------------------
1 | from django.db import models
2 |
3 |
4 | # pop models
5 | class Pop(models.Model):
6 | name = models.CharField(max_length=245)
7 | main_pop = models.ForeignKey('self', on_delete=models.CASCADE,null=True, blank=True)
8 | input_power = models.IntegerField(null=True, blank=True)
9 | total_user = models.IntegerField(null=True, blank=True)
10 |
11 | def __str__(self):
12 | return self.name
13 |
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/earnings/earning_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/earnings/earnings.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}earn form{% endblock title %}
4 | {% block dashboard %}
5 | Earning Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/profile/profile_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}profile form{% endblock title %}
4 | {% block dashboard %}
5 | Profile Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/clients/Templates/clients/create_client.html:
--------------------------------------------------------------------------------
1 | {% extends 'clients/clients.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}clients form{% endblock title %}
4 | {% block dashboard %}
5 | Clients Forms
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/clients/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | app_name = 'client'
7 |
8 | urlpatterns = [
9 | path('', views.ClientsView.as_view(), name='clients'),
10 | path('create/', views.createClients, name='create'),
11 | path('update//', views.UpdateClients.as_view(), name='update'),
12 | path('delete//', views.DeleteClients.as_view(), name='delete'),
13 | ]
14 |
--------------------------------------------------------------------------------
/apps/tasks/Templates/taskCategory/tasksCategory_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}task category form{% endblock title %}
4 | {% block dashboard %}
5 | Task Category Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/commission/commission_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}commission form{% endblock title %}
4 | {% block dashboard %}
5 | Commission Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/packages/templates/packages/packages_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'packages/packages.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}packages form{% endblock title %}
4 | {% block dashboard %}
5 | packages Forms
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/users/templates/auth/createUser.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}{% load crispy_forms_tags %}
3 | {% block title %}owner dashboard{% endblock title %}
4 | {% block dashboard %}
5 | User Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/users/templates/auth/user_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}{% load crispy_forms_tags %}
3 | {% block title %}owner dashboard{% endblock title %}
4 | {% block dashboard %}
5 | User Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ_category_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/employ/employ.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}employ category form{% endblock title %}
4 | {% block dashboard %}
5 | Employ Category Form
6 |
11 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/packages/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import include, path
3 |
4 | from . import views
5 |
6 | app_name = 'packages'
7 |
8 | urlpatterns = [
9 | path('',views.PackagesView.as_view(), name='packages'),
10 | path('create/',views.PackagesCreateView.as_view(), name='create'),
11 | path('update/',views.PackagesUpdateView.as_view(), name='update'),
12 | path('delete/',views.DeletePackages.as_view(), name='delete'),
13 |
14 | ]
--------------------------------------------------------------------------------
/apps/tasks/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from dataclasses import field
3 |
4 | from django.forms import ModelForm
5 |
6 | from .models import TaskCategory, Tasks
7 |
8 |
9 | #* Task Category Form
10 | class TaskCategoryForm(ModelForm):
11 | class Meta:
12 | model = TaskCategory
13 | fields = '__all__'
14 |
15 |
16 | #* Tasks Form
17 | class TasksForm(ModelForm):
18 | class Meta:
19 | model = Tasks
20 | fields = '__all__'
21 | exclude = ['task_token']
22 |
--------------------------------------------------------------------------------
/apps/accountants/decorator.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.shortcuts import redirect
3 |
4 |
5 | def owner_roles(view_func):
6 | def wrapper_func(request, *args, **kwargs):
7 | if request.user.is_authenticated:
8 | if request.user.owner:
9 | return view_func(request, *args, **kwargs)
10 | else:
11 | return redirect('client:clients')
12 | else:
13 | return redirect('/')
14 | return wrapper_func
--------------------------------------------------------------------------------
/apps/warehouse/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from dataclasses import field
3 |
4 | from django.forms import ModelForm
5 |
6 | from .models import Warehouse, WarehouseCategory
7 |
8 |
9 | # warehouse category form
10 | class WarehouseCategoryForm(ModelForm):
11 | class Meta:
12 | model = WarehouseCategory
13 | fields = '__all__'
14 |
15 |
16 | # warehouse product form
17 | class WarehouseProductForm(ModelForm):
18 | class Meta:
19 | model = Warehouse
20 | fields = '__all__'
21 |
--------------------------------------------------------------------------------
/apps/warehouse/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from dataclasses import field
3 |
4 | from django_filters import FilterSet
5 |
6 | from .models import Warehouse, WarehouseCategory
7 |
8 |
9 | # warehouse filter
10 | class WarehouseFilter(FilterSet):
11 | class Meta:
12 | model = Warehouse
13 | fields = ['serial','category','status']
14 |
15 | # category filter
16 | class CategoryFilter(FilterSet):
17 | class Meta:
18 | model = WarehouseCategory
19 | fields = ['name']
20 |
21 |
22 |
--------------------------------------------------------------------------------
/isp_management/asgi.py:
--------------------------------------------------------------------------------
1 | """
2 | ASGI config for isp_management project.
3 |
4 | It exposes the ASGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.asgi import get_asgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'isp_management.settings')
15 |
16 | application = get_asgi_application()
17 |
--------------------------------------------------------------------------------
/isp_management/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for isp_management project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'isp_management.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/apps/pop/Templates/pop/pop_delete_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/context_processors.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from .models import CompanyProfile
3 |
4 |
5 | # get company profile
6 | def company_profile(request):
7 | def create_profile():
8 | CompanyProfile.objects.create(name='Kaliganj Network', city='Ullapara', state='Rajshahi', country='Bangladesh')
9 | return CompanyProfile.objects.get(id=1)
10 | profile = CompanyProfile.objects.get(id=1) if CompanyProfile.objects.all().exists() else create_profile()
11 | return {'profile':profile}
--------------------------------------------------------------------------------
/apps/tasks/Templates/tasks/tasks_delete.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/tasks/Templates/taskCategory/tasksCategory_delete.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block content %}
4 |
5 |
12 |
13 | {% endblock content %}
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/category_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block content %}
4 |
5 |
12 |
13 | {% endblock content %}
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/create_category.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}categories form{% endblock title %}
3 | {% load crispy_forms_tags %}
4 | {% load static %}
5 | {% block dashboard %}
6 |
7 | Categories Form
8 |
13 |
14 |
15 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/warehouse_create.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}warehouse form{% endblock title %}
3 | {% load crispy_forms_tags %}
4 | {% load static %}
5 | {% block dashboard %}
6 |
7 | warehouse forms
8 |
13 |
14 |
15 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/earnings/earn_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block content %}
4 |
5 |
12 |
13 | {% endblock content %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/invest/invest_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block content %}
4 |
5 |
12 |
13 | {% endblock content %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/owner/owner_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}
2 | {% block title %}delete {{ object }}{% endblock title %}
3 | {% block content %}
4 |
5 |
12 |
13 | {% endblock content %}
--------------------------------------------------------------------------------
/apps/onu/Templates/onu/onu_delete_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}delete {{ object.brand }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/clients/Templates/clients/clients_delete.html:
--------------------------------------------------------------------------------
1 | {% extends 'clients/clients.html' %}
2 | {% block title %}delete {{ object.name }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/packages/templates/packages/packages_delete.html:
--------------------------------------------------------------------------------
1 | {% extends 'clients/clients.html' %}
2 | {% block title %}delete {{ object.name }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}{{ object }} category delete{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/warehouse_delete_confirm.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}delete {{ object.Brand }}{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ_category_delete_form.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}Employ category delete{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
12 |
13 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/users/signals.py:
--------------------------------------------------------------------------------
1 | # imports
2 |
3 | from django.contrib.auth import get_user_model
4 | from django.db.models.signals import post_save
5 |
6 | from .models import Profile
7 |
8 | # user model
9 | User = get_user_model()
10 |
11 |
12 |
13 | # profile signals
14 | def create_profile(created, instance,*args, **kwargs):
15 | if created:
16 | Profile.objects.create(
17 | user=instance,
18 | name=f'{instance.first_name} {instance.last_name}',
19 | gender=instance.gender,
20 | )
21 |
22 |
23 |
24 |
25 |
26 | post_save.connect(create_profile, sender=User)
27 |
--------------------------------------------------------------------------------
/apps/users/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | urlpatterns = [
7 | path('',views.loginView, name='login'),
8 | path('users',views.UsersView.as_view(), name='user'),
9 | path('users/',views.UpdateUser.as_view(), name='user-update'),
10 | path('users/del/',views.delete_user, name='user-delete'),
11 | path("logout/", views.logoutView, name="logout"),
12 | path("create/", views.register, name="create-user"),
13 | path("profile/", views.ProfileView.as_view(), name="profile"),
14 | ]
--------------------------------------------------------------------------------
/apps/onu/models.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.db import models
3 |
4 |
5 | #* Onu Models
6 | class Onu(models.Model):
7 | choice = (('Active','Active'),('Stored','Stored'),('Damaged','Damaged'))
8 | brand = models.CharField(max_length=245)
9 | model = models.CharField(max_length=245)
10 | mac = models.CharField(max_length=245)
11 | port = models.IntegerField()
12 | status = models.CharField(max_length=10, choices=choice)
13 | created = models.DateTimeField(auto_now_add=True)
14 | updated = models.DateTimeField(auto_now=True)
15 |
16 | def __str__(self):
17 | return self.mac
18 |
--------------------------------------------------------------------------------
/apps/accountants/filters.py:
--------------------------------------------------------------------------------
1 | # imports
2 | import django_filters
3 |
4 | from .models import Earning, Invest, Owner
5 |
6 |
7 | # owner filters
8 | class OwnerFilter(django_filters.FilterSet):
9 | class Meta:
10 | model = Owner
11 | fields = ['name']
12 |
13 | # invest filters
14 | class InvestFilter(django_filters.FilterSet):
15 | created_at = django_filters.DateTimeFromToRangeFilter(widget=django_filters.widgets.RangeWidget(attrs={'type':'date'}))
16 | class Meta:
17 | model = Invest
18 | fields = []
19 |
20 | # Earning filters
21 | class EarningFilter(django_filters.FilterSet):
22 | class Meta:
23 | model = Earning
24 | fields = ['created_at']
--------------------------------------------------------------------------------
/apps/packages/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | initial = True
9 |
10 | dependencies = [
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Package',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('name', models.CharField(max_length=245)),
19 | ('speed', models.IntegerField()),
20 | ('price', models.FloatField()),
21 | ],
22 | ),
23 | ]
24 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'isp_management.settings')
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == '__main__':
22 | main()
23 |
--------------------------------------------------------------------------------
/apps/tasks/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | app_name = 'tasks'
7 |
8 | urlpatterns = [
9 | path('', views.TasksView.as_view(), name='tasks'),
10 | path('create/', views.createTasks, name='create'),
11 | path('update//', views.UpdateTasks.as_view(), name='update'),
12 | path('delete//', views.DeleteTasks.as_view(), name='delete'),
13 | path('taskCategory/', views.TasksCategoryView.as_view(), name='tasks-category'),
14 | path('taskCategory/create/', views.CreateTasksCategory.as_view(), name='create-category'),
15 | path('taskCategory/update//', views.UpdateTasksCategory.as_view(), name='update-category'),
16 | path('taskCategory/delete//', views.DeleteTasksCategory.as_view(), name='delete-category'),
17 | ]
18 |
--------------------------------------------------------------------------------
/apps/accountants/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.forms import ModelForm
3 |
4 | from .models import Commission, CompanyProfile, Earning, Invest, Owner
5 |
6 |
7 | # Company Profile Form
8 | class CompanyProfileForm(ModelForm):
9 | class Meta:
10 | model = CompanyProfile
11 | fields = '__all__'
12 |
13 | # Owner Form
14 | class OwnerForm(ModelForm):
15 | class Meta:
16 | model = Owner
17 | fields = '__all__'
18 |
19 | # invest form
20 | class InvestForm(ModelForm):
21 | class Meta:
22 | model = Invest
23 | fields = '__all__'
24 |
25 | # Earning form
26 | class EarningForm(ModelForm):
27 | class Meta:
28 | model = Earning
29 | fields = '__all__'
30 |
31 | # Commission form
32 | class CommissionForm(ModelForm):
33 | class Meta:
34 | model = Commission
35 | fields = '__all__'
--------------------------------------------------------------------------------
/isp_management/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 |
3 | from django.conf import settings
4 | from django.conf.urls.static import static
5 | from django.contrib import admin
6 | from django.urls import include, path
7 |
8 | urlpatterns = [
9 | path('',include('apps.users.urls')),
10 | path('admin/', admin.site.urls),
11 | path('clients/', include('apps.clients.urls')),
12 | path('warehouse/', include('apps.warehouse.urls')),
13 | path('onus/', include('apps.onu.urls')),
14 | path('pops/', include('apps.pop.urls')),
15 | path('tasks/', include('apps.tasks.urls')),
16 | path('dashboard/', include('apps.accountants.urls')),
17 | path('packages/', include('apps.packages.urls')),
18 | ]+static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
19 |
--------------------------------------------------------------------------------
/apps/warehouse/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from . import views
5 |
6 | app_name = 'warehouse'
7 |
8 | urlpatterns = [
9 | path('', views.WarehouseProductList.as_view(), name='warehouse'),
10 | path('create', views.WarehouseProductCreate.as_view(), name='warehouse-create'),
11 | path('update/', views.WarehouseProductUpdate.as_view(), name='warehouse-update'),
12 | path('delete/', views.WarehouseProductDelete.as_view(), name='warehouse-delete'),
13 |
14 |
15 | path('categories', views.WarehouseCategoryList.as_view(),name='category'),
16 | path('categories/create', views.WarehouseCreateCategory.as_view(),name='category-create'),
17 | path('categories/update/', views.WarehouseUpdateCategory.as_view(),name='category-update'),
18 | path('categories/delete/', views.WarehouseDeleteCategory.as_view(),name='category-delete'),
19 |
20 |
21 | ]
22 |
--------------------------------------------------------------------------------
/apps/warehouse/models.py:
--------------------------------------------------------------------------------
1 | from secrets import choice
2 | from unicodedata import category
3 |
4 | from django.db import models
5 |
6 | # * Warehouse Category Model
7 |
8 | class WarehouseCategory(models.Model):
9 | name = models.CharField(max_length=245)
10 |
11 | def __str__(self):
12 | return self.name
13 |
14 | # * warehouse product model
15 |
16 | class Warehouse(models.Model):
17 | choice = (('Active','Active'),('Stored','Stored'),('Damaged','Damaged'))
18 | Brand = models.CharField(max_length=245)
19 | model = models.CharField(max_length=245)
20 | serial = models.CharField(max_length=245)
21 | category = models.ForeignKey(WarehouseCategory, on_delete=models.CASCADE, null=True, blank=True)
22 | status = models.CharField(max_length=245, choices=choice)
23 | created = models.DateTimeField(auto_now_add=True)
24 | updated = models.DateTimeField(auto_now=True)
25 |
26 | def __str__(self):
27 | return self.serial
28 |
--------------------------------------------------------------------------------
/apps/pop/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | initial = True
10 |
11 | dependencies = [
12 | ]
13 |
14 | operations = [
15 | migrations.CreateModel(
16 | name='Pop',
17 | fields=[
18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19 | ('name', models.CharField(max_length=245)),
20 | ('input_power', models.IntegerField(blank=True, null=True)),
21 | ('total_user', models.IntegerField(blank=True, null=True)),
22 | ('main_pop', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pop.pop')),
23 | ],
24 | ),
25 | ]
26 |
--------------------------------------------------------------------------------
/apps/users/templates/auth/login.html:
--------------------------------------------------------------------------------
1 | {% load static %}
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | log in
10 |
11 |
12 |
13 |
14 |
15 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/apps/users/templates/users/profile.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}profile: {{user_data.name}}{% endblock title %}
4 | {% block dashboard %}
5 |
21 |
22 |
23 |
24 |

25 |
26 |
27 |
{{user_data.name}}
28 | {% if request.user.owner %} Owner
{% else %} Employ
29 | {% endif %}
30 |
31 |
32 |
33 |
34 |
35 | {% endblock %}
--------------------------------------------------------------------------------
/apps/onu/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | initial = True
9 |
10 | dependencies = [
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Onu',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('brand', models.CharField(max_length=245)),
19 | ('model', models.CharField(max_length=245)),
20 | ('mac', models.CharField(max_length=245)),
21 | ('port', models.IntegerField()),
22 | ('status', models.CharField(choices=[('Active', 'Active'), ('Stored', 'Stored'), ('Damaged', 'Damaged')], max_length=10)),
23 | ('created', models.DateTimeField(auto_now_add=True)),
24 | ('updated', models.DateTimeField(auto_now=True)),
25 | ],
26 | ),
27 | ]
28 |
--------------------------------------------------------------------------------
/apps/users/templates/auth/users.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}user dashboard{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 | User's Details |
13 |
14 |
15 | | # |
16 | first name |
17 | last name |
18 | email |
19 | update |
20 | delete |
21 |
22 |
23 |
24 | {% for user in users %}
25 |
26 | | {{forloop.counter}} |
27 | {{user.first_name}} |
28 | {{user.last_name}} |
29 | {{user.email}} |
30 | update |
31 | delete |
32 |
33 | {% endfor %}
34 |
35 |
36 |
37 | {% endblock %}
--------------------------------------------------------------------------------
/apps/accountants/static/dashboard/baseDashboard.css:
--------------------------------------------------------------------------------
1 | .dashboard-wrapper {
2 | width: 1550px;
3 | height: 90vh;
4 | overflow: hidden;
5 | overflow-y: scroll;
6 | }
7 |
8 | .dashboard-navbar-wrapper {
9 | max-height: 89vh;
10 | min-height: 89vh;
11 | border-radius: 5px;
12 | }
13 |
14 | .dashboard-navbar {
15 | padding-top: 10px;
16 |
17 |
18 | }
19 |
20 | .dashboard-navbar ul li {
21 | list-style: none;
22 | margin-left: -25px;
23 | }
24 |
25 | .dashboard-navbar ul li a {
26 | text-decoration: none;
27 | color: white;
28 | }
29 |
30 | /* Extra large devices (large laptops and desktops, 1400px and up) */
31 | @media only screen and (max-width: 1400px) {
32 | .dashboard-wrapper {
33 | width: 1100px;
34 | height: 90vh;
35 | overflow: hidden;
36 | overflow-y: scroll;
37 | }
38 | }
39 |
40 | /* Extra large devices (large laptops and desktops, 1200px and up) */
41 | @media only screen and (max-width: 1200px) {
42 | .dashboard-wrapper {
43 | width: 900px;
44 | height: 90vh;
45 | overflow: hidden;
46 | overflow-y: scroll;
47 | }
48 | }
--------------------------------------------------------------------------------
/apps/clients/models.py:
--------------------------------------------------------------------------------
1 | from enum import unique
2 |
3 | from django.db import models
4 |
5 | from apps.onu.models import Onu
6 | from apps.packages.models import Package
7 | from apps.pop.models import Pop
8 |
9 | # clients models
10 | # internet user model
11 |
12 | class Clients(models.Model):
13 | choices_select = (('active', 'active'), ('inactive', 'inactive'))
14 | name = models.CharField(max_length=100)
15 | email = models.EmailField(max_length=100)
16 | client_id = models.IntegerField(unique=True)
17 | phone = models.CharField(max_length=100, verbose_name='phone')
18 | nid = models.CharField(max_length=100)
19 | address = models.CharField(max_length=100)
20 | ip = models.CharField(max_length=100, unique=True,verbose_name='IP/UserName')
21 | pack = models.ForeignKey(Package, on_delete=models.CASCADE)
22 | onu = models.ForeignKey(Onu, on_delete=models.CASCADE)
23 | status = models.CharField(max_length=50, choices=choices_select, default='inactive')
24 | pop_name = models.ForeignKey(Pop, on_delete=models.CASCADE)
25 | created = models.DateTimeField(auto_now_add=True)
26 | updated = models.DateTimeField(auto_now=True)
27 |
28 | def __str__(self):
29 | return self.name
30 |
--------------------------------------------------------------------------------
/apps/employ/models.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth import get_user_model
3 | from django.db import models
4 |
5 | # user
6 | User = get_user_model()
7 |
8 |
9 | # Worker category model
10 |
11 | class EmployCategory(models.Model):
12 | name = models.CharField(max_length=245)
13 |
14 | def __str__(self):
15 | return self.name
16 |
17 |
18 | # Employ models
19 |
20 | class Employ(models.Model):
21 | choices_select = (('active', 'active'), ('inactive', 'inactive'))
22 | user = models.OneToOneField(User, on_delete=models.CASCADE)
23 | name = models.CharField(max_length=100)
24 | father_name = models.CharField(max_length=245)
25 | mother_name = models.CharField(max_length=245)
26 | email = models.EmailField(max_length=100)
27 | phone = models.CharField(max_length=100, verbose_name='phone', unique=True)
28 | nid = models.CharField(max_length=100)
29 | address = models.CharField(max_length=100)
30 | status = models.CharField(max_length=50, choices=choices_select, default='active')
31 | type = models.ForeignKey(EmployCategory, on_delete=models.CASCADE)
32 | created = models.DateTimeField(auto_now_add=True)
33 | updated = models.DateTimeField(auto_now=True)
34 |
35 | def __str__(self):
36 | return self.name
37 |
--------------------------------------------------------------------------------
/apps/tasks/models.py:
--------------------------------------------------------------------------------
1 | # Imports
2 | from django.db import models
3 |
4 | from apps.employ.models import Employ
5 |
6 |
7 | #* Task category Model
8 | class TaskCategory(models.Model):
9 | name = models.CharField(max_length=150)
10 |
11 | def __str__(self):
12 | return self.name
13 |
14 | # * Task Model
15 | class Tasks(models.Model):
16 | status = (('pending','pending'),('in progress', 'in progress'),('complete','complete'))
17 | title = models.CharField(max_length=150)
18 | task_category = models.ForeignKey(TaskCategory, on_delete=models.CASCADE)
19 | describe = models.TextField()
20 | equipment_price = models.IntegerField(null=True, blank=True)
21 | client_charged = models.IntegerField(null=True, blank=True)
22 | traveling_allowance = models.IntegerField(null=True, blank=True)
23 | creator = models.ForeignKey(Employ, on_delete=models.CASCADE, related_name = 'Task_Creator')
24 | solver = models.ForeignKey(Employ, on_delete=models.CASCADE, null=True, blank=True)
25 | task_token = models.IntegerField()
26 | status = models.CharField(max_length=150, choices=status)
27 | approved = models.BooleanField(default=False)
28 | created = models.DateTimeField(auto_now_add=True)
29 | updated = models.DateTimeField(auto_now=True)
30 |
31 | def __str__(self):
32 | return self.title
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/apps/packages/templates/packages/packages.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}clients details{% endblock title %}
4 | {% block extraHead %}
5 |
6 | {% endblock extraHead %}
7 | {% block dashboard %}
8 |
9 |
10 |
11 |
12 | |
13 | Create
14 | |
15 |
16 |
17 | | # |
18 | name |
19 | speed |
20 | price |
21 | update |
22 | delete |
23 |
24 |
25 |
26 | {% for package in packages %}
27 |
28 | | {{forloop.counter}} |
29 | {{package.name}} |
30 | {{package.speed}} |
31 | {{package.price}} |
32 | update |
33 | delete |
34 |
35 | {% endfor %}
36 |
37 |
38 |
39 |
40 |
41 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/tasks/Templates/taskCategory/taskCategory.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}task category{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 |
13 |
14 | | # |
15 | name |
16 | update |
17 | delete |
18 |
19 |
20 |
21 | {% for category in taskCategory %}
22 |
23 | | {{forloop.counter}} |
24 | {{category.name}} |
25 | update |
26 | delete |
27 |
28 | {% endfor %}
29 |
30 |
31 |
32 |
33 | {% if taskCategory.has_previous %}
34 | previous
35 | {% endif %}
36 | {{taskCategory.number}}
37 | {% if taskCategory.has_next %}
38 | next
39 | {% endif %}
40 |
41 |
42 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ_category.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}Employ_category Dashboard{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
6 |
7 |
8 | |
9 | Create
10 | |
11 |
12 |
13 | | # |
14 | name |
15 | update |
16 | delete |
17 |
18 |
19 |
20 | {% for employ_category in categories %}
21 |
22 | | {{forloop.counter}} |
23 | {{employ_category.name}} |
24 | update |
25 | delete |
26 |
27 | {% endfor %}
28 |
29 |
30 |
31 |
32 | {% if categories.has_previous %}
33 | previous
34 | {% endif %}
35 | {{categories.number}}
36 | {% if categories.has_next %}
37 | next
38 | {% endif %}
39 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/models.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth import get_user_model
3 | from django.db import models
4 |
5 | # user
6 | User = get_user_model()
7 |
8 | # Company Profile
9 | class CompanyProfile(models.Model):
10 | name = models.CharField(max_length=245)
11 | city = models.CharField(max_length=245)
12 | state = models.CharField(max_length=245)
13 | country = models.CharField(max_length=245)
14 |
15 | def __str__(self):
16 | return self.name
17 |
18 | # owner model
19 | class Owner(models.Model):
20 | user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='Owner')
21 | name = models.CharField(max_length=150)
22 | Commission = models.IntegerField()
23 |
24 | def __str__(self):
25 | return self.name
26 |
27 | # model wrapper
28 | class Wrapper(models.Model):
29 | created_at = models.DateTimeField(auto_now_add=True)
30 | updated_at = models.DateTimeField(auto_now=True)
31 |
32 |
33 | # invest model
34 | class Invest(Wrapper):
35 | invest_details = models.CharField(max_length=500)
36 | invest_amount = models.IntegerField()
37 |
38 | def __str__(self):
39 | return self.invest_details
40 |
41 |
42 | # earning model
43 | class Earning(Wrapper):
44 | earning_details = models.CharField(max_length=500)
45 | earning_amount = models.IntegerField()
46 |
47 | def __str__(self):
48 | return self.earning_details
49 |
50 | # Commission model
51 | class Commission(models.Model):
52 | profit = models.FloatField()
53 |
54 | def __str__(self):
55 | return str(self.profit)
56 |
--------------------------------------------------------------------------------
/apps/warehouse/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | initial = True
10 |
11 | dependencies = [
12 | ]
13 |
14 | operations = [
15 | migrations.CreateModel(
16 | name='WarehouseCategory',
17 | fields=[
18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19 | ('name', models.CharField(max_length=245)),
20 | ],
21 | ),
22 | migrations.CreateModel(
23 | name='Warehouse',
24 | fields=[
25 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
26 | ('Brand', models.CharField(max_length=245)),
27 | ('model', models.CharField(max_length=245)),
28 | ('serial', models.CharField(max_length=245)),
29 | ('status', models.CharField(choices=[('Active', 'Active'), ('Stored', 'Stored'), ('Damaged', 'Damaged')], max_length=245)),
30 | ('created', models.DateTimeField(auto_now_add=True)),
31 | ('updated', models.DateTimeField(auto_now=True)),
32 | ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='warehouse.warehousecategory')),
33 | ],
34 | ),
35 | ]
36 |
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/category.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}warehouse category{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 |
19 |
20 |
21 | | # |
22 | name |
23 | update |
24 | delete |
25 |
26 |
27 |
28 | {% for category in categories %}
29 |
30 | | {{forloop.counter}} |
31 | {{category.name}} |
32 | update |
33 | delete |
34 | {% endfor %}
35 |
36 |
37 |
38 |
39 | {% if categories.has_previous %}
40 | previous
41 | {% endif %}
42 | {{categories.number}}
43 | {% if categories.has_next %}
44 | next
45 | {% endif %}
46 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/owner/owner.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}owner dashboard{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 |
21 |
22 |
23 | | # |
24 | name |
25 | commission |
26 | update |
27 | delete |
28 |
29 |
30 |
31 | {% for owner in owners %}
32 |
33 | | {{forloop.counter}} |
34 | {{owner.name}} |
35 | {{owner.Commission}} |
36 | update |
37 | delete |
38 |
39 | {% endfor %}
40 |
41 |
42 |
43 |
44 | {% if owners.has_previous %}
45 | previous
46 | {% endif %}
47 | {{owners.number}}
48 | {% if owners.has_next %}
49 | next
50 | {% endif %}
51 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/pop/Templates/pop/pops.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}pop details{% endblock title %}
4 | {% block extraHead %}
5 |
6 | {% endblock extraHead %}
7 | {% block dashboard %}
8 |
9 |
10 |
11 |
12 | |
13 | Create
14 | |
15 |
24 |
25 |
26 | | # |
27 | name |
28 | main pop |
29 | pon power |
30 | pop user |
31 | update |
32 | delete |
33 |
34 |
35 |
36 | {% for pop in pops %}
37 |
38 | | {{forloop.counter}} |
39 | {{pop.name}} |
40 | {{pop.main_pop}} |
41 | {{pop.input_power}} |
42 | {{pop.total_user}} |
43 | update |
44 | delete |
45 |
46 | {% endfor %}
47 |
48 |
49 |
50 |
51 | {% if pops.has_previous %}
52 | previous
53 | {% endif %}
54 | {{pops.number}}
55 | {% if pops.has_next %}
56 | next
57 | {% endif %}
58 |
59 |
60 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/clients/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | initial = True
10 |
11 | dependencies = [
12 | ('onu', '0001_initial'),
13 | ('packages', '0001_initial'),
14 | ('pop', '0001_initial'),
15 | ]
16 |
17 | operations = [
18 | migrations.CreateModel(
19 | name='Clients',
20 | fields=[
21 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22 | ('name', models.CharField(max_length=100)),
23 | ('email', models.EmailField(max_length=100)),
24 | ('client_id', models.IntegerField(unique=True)),
25 | ('phone', models.CharField(max_length=100, verbose_name='phone')),
26 | ('nid', models.CharField(max_length=100)),
27 | ('address', models.CharField(max_length=100)),
28 | ('ip', models.CharField(max_length=100, unique=True, verbose_name='IP/UserName')),
29 | ('status', models.CharField(choices=[('active', 'active'), ('inactive', 'inactive')], default='inactive', max_length=50)),
30 | ('created', models.DateTimeField(auto_now_add=True)),
31 | ('updated', models.DateTimeField(auto_now=True)),
32 | ('onu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='onu.onu')),
33 | ('pack', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='packages.package')),
34 | ('pop_name', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='pop.pop')),
35 | ],
36 | ),
37 | ]
38 |
--------------------------------------------------------------------------------
/apps/users/admin.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib import admin
3 | # Register your models here.
4 | from django.contrib.auth import get_user_model
5 | from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
6 | from django.contrib.auth.models import Group
7 |
8 | from .forms import UserAdminChangeForm, UserAdminCreationForm
9 | from .models import *
10 |
11 | User = get_user_model()
12 |
13 | # unregister group model
14 | admin.site.unregister(Group)
15 |
16 |
17 | @admin.register(User)
18 | class UserAdmin(BaseUserAdmin):
19 | # The forms to add and change user instances
20 | form = UserAdminChangeForm
21 | add_form = UserAdminCreationForm
22 | # The fields to be used in displaying the User model.
23 | # These override the definitions on the base UserAdmin
24 | # that reference specific fields on auth.User.
25 | list_display = ['email', 'first_name', 'last_name', 'admin']
26 | list_filter = ['admin']
27 | fieldsets = (
28 | (None, {'fields': ('email', 'password')}),
29 | ('Personal info', {
30 | 'fields': ('first_name', 'last_name', 'gender')}),
31 | ('Permissions', {'fields': ('staff', 'admin','owner', 'employs')}),
32 | )
33 | # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
34 | # overrides get_fieldsets to use this attribute when creating a user.
35 | add_fieldsets = (
36 | (None, {
37 | 'classes': ('wide',),
38 | 'fields': ('email', 'password', 'password2', 'first_name', 'last_name', 'gender', 'staff', 'admin')}
39 | ),
40 | )
41 | search_fields = ['email']
42 | ordering = ['email']
43 | filter_horizontal = ()
44 |
45 | class Meta:
46 | model = User
47 | fields = ['email']
48 |
49 | # profile model
50 | @admin.register(Profile)
51 | class ProfileAdmin(admin.ModelAdmin):
52 | list_display = ['user','name','gender']
53 | list_display_links = ['user','name']
54 |
--------------------------------------------------------------------------------
/apps/users/static/login.css:
--------------------------------------------------------------------------------
1 | @import "bourbon";
2 |
3 | body {
4 | background-color: rgba(33, 37, 41, 1);
5 | font-family: 'Asap', sans-serif;
6 | }
7 |
8 | .login {
9 | overflow: hidden;
10 | background-color: white;
11 | padding: 40px 30px 30px 30px;
12 | border-radius: 10px;
13 | position: absolute;
14 | top: 25%;
15 | left: 37.5%;
16 | width: 25%;
17 | box-shadow: 5px 10px 10px rgba(33, 37, 41, 1);
18 | }
19 |
20 | .login::before,
21 | .login::after {
22 | content: '';
23 | position: absolute;
24 | width: 600px;
25 | height: 600px;
26 | border-top-left-radius: 40%;
27 | border-top-right-radius: 45%;
28 | border-bottom-left-radius: 35%;
29 | border-bottom-right-radius: 40%;
30 | z-index: -1;
31 | }
32 |
33 | .login::before {
34 | left: 40%;
35 | bottom: -130%;
36 | background-color: rgba(69, 105, 144, 0.15);
37 | }
38 |
39 | .login::after {
40 | left: 35%;
41 | bottom: -125%;
42 | background-color: rgba(33, 37, 41, 1);
43 | }
44 |
45 | .login>input {
46 | font-family: 'Asap', sans-serif;
47 | display: block;
48 | border-radius: 5px;
49 | font-size: 16px;
50 | background: white;
51 | width: 100%;
52 | border: 0;
53 | padding: 10px 10px;
54 | margin: 15px -10px;
55 | }
56 |
57 | .login>button {
58 | font-family: 'Asap', sans-serif;
59 | cursor: pointer;
60 | color: #fff;
61 | font-size: 16px;
62 | text-transform: uppercase;
63 | width: 80px;
64 | border: 0;
65 | padding: 10px 0;
66 | margin-top: 10px;
67 | margin-left: -5px;
68 | border-radius: 5px;
69 | background-color: rgba(33, 37, 41, 1);
70 | }
71 |
72 | .login>button:hover {
73 | background-color: rgba(33, 37, 41, 1);
74 | }
75 |
76 | a {
77 | text-decoration: none;
78 | color: rgba(33, 37, 41, 1);
79 | position: absolute;
80 | right: 10px;
81 | bottom: 10px;
82 | font-size: 12px;
83 | }
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/invest/invest.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}invest dashboard{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 |
19 |
20 |
21 | | # |
22 | invest details |
23 | invest amount |
24 | created at |
25 | updated at |
26 | update |
27 | delete |
28 |
29 |
30 |
31 | {% for invest in invests %}
32 |
33 | | {{forloop.counter}} |
34 | {{invest.invest_details}} |
35 | {{invest.invest_amount}} |
36 | {{invest.created_at}} |
37 | {{invest.updated_at}} |
38 | update |
39 | delete |
40 |
41 | {% endfor %}
42 |
43 |
44 |
45 |
46 | {% if invests.has_previous %}
47 | previous
48 | {% endif %}
49 | {{invests.number}}
50 | {% if invests.has_next %}
51 | next
52 | {% endif %}
53 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/earnings/earnings.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}earning dashboard{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
8 |
9 | |
10 | Create
11 | |
12 |
21 |
22 |
23 | | # |
24 | earn details |
25 | earn amount |
26 | created at |
27 | updated at |
28 | update |
29 | delete |
30 |
31 |
32 |
33 | {% for earn in earnings %}
34 |
35 | | {{forloop.counter}} |
36 | {{earn.earning_details}} |
37 | {{earn.earning_amount}} |
38 | {{earn.created_at}} |
39 | {{earn.updated_at}} |
40 | update |
41 | delete |
42 |
43 | {% endfor %}
44 |
45 |
46 |
47 |
48 | {% if earnings.has_previous %}
49 | previous
50 | {% endif %}
51 | {{earnings.number}}
52 | {% if earnings.has_next %}
53 | next
54 | {% endif %}
55 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/packages/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.shortcuts import render
6 | from django.utils.decorators import method_decorator
7 | from django.views import View
8 | from django.views.generic import CreateView, DeleteView, UpdateView
9 |
10 | from .forms import PackagesForm
11 | from .models import Package
12 |
13 |
14 | # Packages list view
15 | @method_decorator(login_required(login_url='login'), name='dispatch')
16 | class PackagesView(View):
17 | def get(self,request):
18 | packages = Package.objects.all()
19 | context = {
20 | 'packages':packages
21 | }
22 | return render(request, 'packages/packages.html', context)
23 |
24 | # Packages Create view
25 | @method_decorator(login_required(login_url='login'), name='dispatch')
26 | class PackagesCreateView(SuccessMessageMixin,CreateView):
27 | form_class = PackagesForm
28 | template_name = 'packages/packages_form.html'
29 | success_url = '/packages'
30 | success_message ='new packages created'
31 | error_message ='packages not created'
32 |
33 |
34 | # Packages Update view
35 | class PackagesUpdateView(SuccessMessageMixin,UpdateView):
36 | model = Package
37 | form_class = PackagesForm
38 | template_name = 'packages/packages_form.html'
39 | success_url = '/packages'
40 | success_message ='packages updated'
41 | error_message ='packages not updated'
42 |
43 | # clients Delete View
44 | @method_decorator(login_required(login_url='login'), name='dispatch')
45 | class DeletePackages(SuccessMessageMixin,DeleteView):
46 | model = Package
47 | template_name = 'packages/packages_delete.html'
48 | success_url = '/packages'
49 | success_message ='packages deleted'
50 | error_message ='packages not deleted'
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/employ/employ.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% block title %}Employ Dashboard{% endblock title %}
3 | {% block dashboard %}
4 |
5 |
6 |
7 |
8 | |
9 | Create
10 | |
11 |
24 |
25 |
26 | | # |
27 | name |
28 | phone |
29 | address |
30 | status |
31 | update |
32 | delete |
33 |
34 |
35 |
36 | {% for employ in employs %}
37 |
38 | | {{forloop.counter}} |
39 | {{employ.name}} |
40 | {{employ.phone}} |
41 | {{employ.address}} |
42 | {{employ.status}} |
43 | update |
44 | delete |
45 |
46 | {% endfor %}
47 |
48 |
49 |
50 |
51 | {% if employs.has_previous %}
52 | previous
53 | {% endif %}
54 | {{employs.number}}
55 | {% if employs.has_next %}
56 | next
57 | {% endif %}
58 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/baseDashboard.html:
--------------------------------------------------------------------------------
1 | {% extends 'base.html' %}{% load static %}
2 | {% block title %}dashboard{% endblock title %}
3 | {% block dashHead %}
4 |
5 | {% endblock dashHead %}
6 | {% block content %}
7 |
8 |
9 |
28 |
29 |
30 | {% block dashboard %}{% endblock dashboard %}
31 |
32 |
33 |
34 |
35 | {% endblock content %}
36 |
--------------------------------------------------------------------------------
/apps/employ/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.conf import settings
4 | from django.db import migrations, models
5 | import django.db.models.deletion
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | initial = True
11 |
12 | dependencies = [
13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='EmployCategory',
19 | fields=[
20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('name', models.CharField(max_length=245)),
22 | ],
23 | ),
24 | migrations.CreateModel(
25 | name='Employ',
26 | fields=[
27 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28 | ('name', models.CharField(max_length=100)),
29 | ('father_name', models.CharField(max_length=245)),
30 | ('mother_name', models.CharField(max_length=245)),
31 | ('email', models.EmailField(max_length=100)),
32 | ('phone', models.CharField(max_length=100, unique=True, verbose_name='phone')),
33 | ('nid', models.CharField(max_length=100)),
34 | ('address', models.CharField(max_length=100)),
35 | ('status', models.CharField(choices=[('active', 'active'), ('inactive', 'inactive')], default='active', max_length=50)),
36 | ('created', models.DateTimeField(auto_now_add=True)),
37 | ('updated', models.DateTimeField(auto_now=True)),
38 | ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='employ.employcategory')),
39 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
40 | ],
41 | ),
42 | ]
43 |
--------------------------------------------------------------------------------
/apps/onu/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.db.models import Sum
6 | from django.shortcuts import redirect, render
7 | from django.utils.decorators import method_decorator
8 | from django.views import View
9 | from django.views.generic import CreateView, DeleteView, UpdateView
10 |
11 | from .filters import OnuFilter
12 | from .forms import OnuForm
13 | from .models import Onu
14 |
15 |
16 | #* onu lists
17 | @method_decorator(login_required(login_url='login'), name='dispatch')
18 | class OnuList(View):
19 | def get(self, request):
20 | onus = Onu.objects.all()
21 | filters = OnuFilter(request.GET, queryset =onus)
22 | onus = filters.qs
23 | paginator = Paginator(onus, 25)
24 | page_number = request.GET.get('paginator')
25 | onus = paginator.get_page(page_number)
26 | context = {
27 | 'onus':onus, 'filters':filters
28 | }
29 | return render(request,'onu/onus.html', context)
30 |
31 | #* Onu create
32 | @method_decorator(login_required(login_url='login'), name='dispatch')
33 | class OnuCreate(SuccessMessageMixin, CreateView):
34 | form_class = OnuForm
35 | template_name = 'onu/onu_form.html'
36 | success_url = '/onus'
37 | success_message = 'onu created'
38 | error_message = 'failed to created onu'
39 |
40 |
41 | #* Onu Update
42 | @method_decorator(login_required(login_url='login'), name='dispatch')
43 | class OnuUpdate(SuccessMessageMixin, UpdateView):
44 | model = Onu
45 | form_class = OnuForm
46 | template_name = 'onu/onu_form.html'
47 | success_url = '/onus'
48 | success_message = 'onu updated'
49 | error_message = 'failed to updated onu'
50 |
51 |
52 | #* Onu Delete
53 | @method_decorator(login_required(login_url='login'), name='dispatch')
54 | class OnuDelete(SuccessMessageMixin,DeleteView):
55 | model = Onu
56 | template_name = 'onu/onu_delete_form.html'
57 | success_url = '/onus'
58 | success_message = 'onu deleted'
59 | error_message = 'failed to deleted onu'
--------------------------------------------------------------------------------
/apps/pop/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.shortcuts import render
6 | from django.utils.decorators import method_decorator
7 | from django.views import View
8 | from django.views.generic import CreateView, DeleteView, UpdateView
9 |
10 | from .filters import PopFilter
11 | from .forms import PopForm
12 | from .models import Pop
13 |
14 | '''
15 | Pop list view
16 |
17 | '''
18 | @method_decorator(login_required(login_url='login'), name='dispatch')
19 | class PopList(View):
20 | def get(self, request):
21 | pops = Pop.objects.all()
22 | filters = PopFilter(request.GET, queryset=pops)
23 | paginator = Paginator(filters.qs, 25)
24 | page_number = request.GET.get('page_number')
25 | pops = paginator.get_page(page_number)
26 |
27 | context = {
28 | 'pops':pops, 'filters':filters
29 | }
30 |
31 | return render(request,'pop/pops.html', context)
32 |
33 |
34 | '''
35 | Pop Create View
36 |
37 | '''
38 | @method_decorator(login_required(login_url='login'), name='dispatch')
39 | class CreatePop(SuccessMessageMixin,CreateView):
40 | form_class = PopForm
41 | template_name = 'pop/pop_form.html'
42 | success_url = '/pops'
43 | success_message = 'pop created'
44 | error_message = 'failed to create pop'
45 |
46 |
47 | '''
48 | Pop Update View
49 |
50 | '''
51 | @method_decorator(login_required(login_url='login'), name='dispatch')
52 | class UpdatePop(SuccessMessageMixin,UpdateView):
53 | model = Pop
54 | form_class = PopForm
55 | template_name = 'pop/pop_form.html'
56 | success_url = '/pops'
57 | success_message = 'pop created'
58 | error_message = 'failed to create pop'
59 |
60 |
61 | '''
62 | Pop Delete View
63 |
64 | '''
65 | @method_decorator(login_required(login_url='login'), name='dispatch')
66 | class DeletePop(SuccessMessageMixin,DeleteView):
67 | model = Pop
68 | template_name = 'pop/pop_delete_form.html'
69 | success_url = '/pops'
70 | success_message = 'pop created'
71 | error_message = 'failed to create pop'
72 |
--------------------------------------------------------------------------------
/apps/tasks/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.db import migrations, models
4 | import django.db.models.deletion
5 |
6 |
7 | class Migration(migrations.Migration):
8 |
9 | initial = True
10 |
11 | dependencies = [
12 | ('employ', '0001_initial'),
13 | ]
14 |
15 | operations = [
16 | migrations.CreateModel(
17 | name='TaskCategory',
18 | fields=[
19 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20 | ('name', models.CharField(max_length=150)),
21 | ],
22 | ),
23 | migrations.CreateModel(
24 | name='Tasks',
25 | fields=[
26 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
27 | ('title', models.CharField(max_length=150)),
28 | ('describe', models.TextField()),
29 | ('equipment_price', models.IntegerField(blank=True, null=True)),
30 | ('client_charged', models.IntegerField(blank=True, null=True)),
31 | ('traveling_allowance', models.IntegerField(blank=True, null=True)),
32 | ('task_token', models.IntegerField()),
33 | ('status', models.CharField(choices=[('pending', 'pending'), ('in progress', 'in progress'), ('complete', 'complete')], max_length=150)),
34 | ('approved', models.BooleanField(default=False)),
35 | ('created', models.DateTimeField(auto_now_add=True)),
36 | ('updated', models.DateTimeField(auto_now=True)),
37 | ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='Task_Creator', to='employ.employ')),
38 | ('solver', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='employ.employ')),
39 | ('task_category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tasks.taskcategory')),
40 | ],
41 | ),
42 | ]
43 |
--------------------------------------------------------------------------------
/apps/tasks/Templates/tasks/tasks.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}tasks details{% endblock title %}
4 | {% block extraHead %}
5 |
6 | {% endblock extraHead %}
7 | {% block dashboard %}
8 |
9 |
10 |
11 |
12 | |
13 | Create
14 | |
15 |
26 |
27 |
28 | | # |
29 | task_token |
30 | creator |
31 | solver |
32 | title |
33 | status |
34 | approved |
35 | created at |
36 | updated at |
37 | update |
38 | delete |
39 |
40 |
41 |
42 | {% for task in tasks %}
43 |
44 | | {{forloop.counter}} |
45 | {{task.task_token}} |
46 | {{task.creator}} |
47 | {{task.solver}} |
48 | {{task.title}} |
49 | {{task.status}} |
50 | {{task.approved}} |
51 | {{task.created}} |
52 | {{task.updated}} |
53 | update |
54 | delete |
55 |
56 | {% endfor %}
57 |
58 |
59 |
60 |
61 | {% if tasks.has_previous %}
62 | previous
63 | {% endif %}
64 | {{tasks.number}}
65 | {% if tasks.has_next %}
66 | next
67 | {% endif %}
68 |
69 |
70 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/onu/Templates/onu/onus.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}onus details{% endblock title %}
4 | {% block extraHead %}
5 |
6 | {% endblock extraHead %}
7 | {% block dashboard %}
8 |
9 |
10 |
11 |
12 | |
13 | Create
14 | |
15 |
30 |
31 |
32 | | # |
33 | brand |
34 | model |
35 | mac |
36 | port |
37 | status |
38 | created |
39 | updated |
40 | update |
41 | delete |
42 |
43 |
44 |
45 | {% for onu in onus %}
46 |
47 | | {{forloop.counter}} |
48 | {{onu.brand}} |
49 | {{onu.model}} |
50 | {{onu.mac}} |
51 | {{onu.port}} |
52 | {{onu.status}} |
53 | {{onu.created}} |
54 | {{onu.updated}} |
55 | update |
56 | delete |
57 |
58 | {% endfor %}
59 |
60 |
61 |
62 |
63 | {% if onus.has_previous %}
64 | previous
65 | {% endif %}
66 | {{onus.number}}
67 | {% if onus.has_next %}
68 | next
69 | {% endif %}
70 |
71 |
72 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/warehouse/templates/warehouse/warehouse.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %} {% load static %}
2 | {% block title %}warehouse{% endblock title %}
3 | {% block extraHead %}
4 |
5 | {% endblock extraHead %}
6 | {% block dashboard %}
7 |
8 |
9 |
10 |
11 | |
12 | Create
13 | |
14 |
29 |
30 |
31 | | # |
32 | brand |
33 | model |
34 | serial |
35 | category |
36 | status |
37 | created |
38 | updated |
39 | update |
40 | delete |
41 |
42 |
43 |
44 | {% for product in products %}
45 |
46 | | {{forloop.counter}} |
47 | {{product.Brand}} |
48 | {{product.model}} |
49 | {{product.serial}} |
50 | {{product.category}} |
51 | {{product.status}} |
52 | {{product.created}} |
53 | {{product.updated}} |
54 | update |
55 | delete |
56 | {% endfor %}
57 |
58 |
59 |
60 |
61 | {% if products.has_previous %}
62 | previous
63 | {% endif %}
64 | {{products.number}}
65 | {% if products.has_next %}
66 | next
67 | {% endif %}
68 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/clients/Templates/clients/clients.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load static %}
3 | {% block title %}clients details{% endblock title %}
4 | {% block extraHead %}
5 |
6 | {% endblock extraHead %}
7 | {% block dashboard %}
8 |
9 |
10 |
11 |
12 | |
13 | Create
14 | |
15 |
30 |
31 |
32 | | # |
33 | name |
34 | phone |
35 | subscriber id |
36 | ip/Username |
37 | created at |
38 | updated at |
39 | update |
40 | delete |
41 |
42 |
43 |
44 | {% for client in clients %}
45 |
46 | | {{forloop.counter}} |
47 | {{client.name}} |
48 | {{client.phone}} |
49 | {{client.client_id}} |
50 | {{client.ip}} |
51 | {{client.created}} |
52 | {{client.updated}} |
53 | update |
54 | delete |
55 |
56 | {% endfor %}
57 |
58 |
59 |
60 |
61 | {% if clients.has_previous %}
62 | previous
63 | {% endif %}
64 | {{clients.number}}
65 | {% if clients.has_next %}
66 | next
67 | {% endif %}
68 |
69 |
70 | {% endblock dashboard %}
--------------------------------------------------------------------------------
/apps/accountants/urls.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.urls import path
3 |
4 | from apps.employ import views as employ_views
5 |
6 | from . import views
7 |
8 | app_name = 'dashboard'
9 |
10 | urlpatterns = [
11 | path('', views.OwnerDashboard.as_view(), name='dashboard'),
12 | # ? owners urls
13 | path('owners', views.OwnerView.as_view(), name='owners'),
14 | path('owners/create', views.OwnerCreate.as_view(), name='owner-create'),
15 | path('owners/update/', views.OwnerUpdate.as_view(), name='owner-update'),
16 | path('owners/delete/', views.OwnerDelete.as_view(), name='owner-delete'),
17 | # ? employ urls
18 | path('employ', employ_views.EmployView.as_view(), name='employ'),
19 | path('employ/create', employ_views.EmployCreate.as_view(), name='employ-create'),
20 | path('employ/update/', employ_views.UpdateEmploy.as_view(), name='employ-update'),
21 | path('employ/delete/', employ_views.EmployDelete.as_view(), name='employ-delete'),
22 | path('employ/category', employ_views.EmployCategoryView.as_view(), name='employ_category'),
23 | path('employ/category/create', employ_views.EmployCategoryCreate.as_view(), name='employ_category-create'),
24 | path('employ/category/update/', employ_views.UpdateCategoryEmploy.as_view(), name='employ_category-update'),
25 | path('employ/category/delete/', employ_views.EmployCategoryDelete.as_view(), name='employ_category-delete'),
26 |
27 | # ? invests urls
28 | path('invest/', views.InvestView.as_view(), name='invests'),
29 | path('invest/create', views.InvestCreateView.as_view(), name='invests-create'),
30 | path('invest/update//', views.InvestUpdateView.as_view(), name='invests-update'),
31 | path('invest/delete//', views.InvestDelete.as_view(), name='invests-delete'),
32 |
33 | # ? invests urls
34 | path('earns/', views.EarnView.as_view(), name='earns'),
35 | path('earns/create', views.EarnCreateView.as_view(), name='earns-create'),
36 | path('earns/update//', views.EarnUpdateView.as_view(), name='earns-update'),
37 | path('earns/delete//', views.EarnDelete.as_view(), name='earns-delete'),
38 |
39 | # ? commissions update urls
40 | path('settings/commission/update/',views.CommissionUpdateView.as_view(), name='commission-update'),
41 |
42 | # ? profile update urls
43 | path('settings/profile/update/',views.CompanyProfileView.as_view(), name='profile-update')
44 |
45 | ]
46 |
--------------------------------------------------------------------------------
/apps/clients/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.db.models import Sum
6 | from django.shortcuts import redirect, render
7 | from django.utils.decorators import method_decorator
8 | from django.views import View
9 | from django.views.generic import CreateView, DeleteView, UpdateView
10 |
11 | from .filters import ClientFilter
12 | from .forms import ClientsForm
13 | from .models import Clients
14 |
15 | # Create your views here.
16 |
17 | # Clients Models
18 | @method_decorator(login_required(login_url='login'), name='dispatch')
19 | class ClientsView(View):
20 | def get(self,request):
21 | clients = Clients.objects.all()
22 | filters = ClientFilter(request.GET, queryset=clients)
23 | clients = filters.qs
24 | paginator = Paginator(clients, 25)
25 | page_number = request.GET.get('paginator')
26 | clients = paginator.get_page(page_number)
27 | context = {
28 | 'clients':clients,'filters':filters
29 | }
30 | return render(request, 'clients/clients.html', context)
31 |
32 |
33 | # Clients Create view
34 | @login_required(login_url='login')
35 | def createClients(request):
36 | form = ClientsForm()
37 | if request.method == 'POST':
38 | form = ClientsForm(request.POST)
39 | if form.is_valid():
40 | obj = form.save(commit=False)
41 | c_id = Clients.objects.aggregate(Sum('client_id'))['client_id__sum'] + 1 if Clients.objects.aggregate(Sum('client_id'))['client_id__sum'] else 100000
42 | obj.client_id = c_id
43 | obj.save()
44 | return redirect('client:clients')
45 |
46 | context = {
47 | 'form':form
48 | }
49 | return render(request,'clients/create_client.html',context)
50 |
51 | # clients Update View
52 | @method_decorator(login_required(login_url='login'), name='dispatch')
53 | class UpdateClients(SuccessMessageMixin,UpdateView):
54 | model = Clients
55 | form_class = ClientsForm
56 | template_name = 'clients/create_client.html'
57 | success_url = '/clients'
58 | success_message ='new clients updated'
59 | error_message ='clients not updated'
60 |
61 |
62 | # clients Delete View
63 | @method_decorator(login_required(login_url='login'), name='dispatch')
64 | class DeleteClients(SuccessMessageMixin,DeleteView):
65 | model = Clients
66 | template_name = 'clients/clients_delete.html'
67 | success_url = '/clients'
68 | success_message ='clients deleted'
69 | error_message ='clients not deleted'
70 |
--------------------------------------------------------------------------------
/apps/users/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth import authenticate, get_user_model, login, logout
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.shortcuts import redirect, render
5 | from django.views.generic import UpdateView, View
6 |
7 | from .decorator import auth_user
8 | from .forms import RegisterForm, UserUpdateForm
9 | from .models import Profile
10 |
11 | '''
12 | User Model
13 |
14 | '''
15 | User = get_user_model()
16 |
17 | class UsersView(View):
18 | def get(self, request):
19 | users = User.objects.all()
20 | context = {
21 | 'users':users
22 | }
23 | return render(request, 'auth/users.html', context)
24 |
25 |
26 | '''
27 | Create User
28 |
29 | '''
30 | def register(request):
31 | form = RegisterForm()
32 | if request.method == 'POST':
33 | form = RegisterForm(request.POST)
34 | if form.is_valid():
35 | form.save()
36 | return redirect('user')
37 | context = {'form':form}
38 | return render(request,'auth/createUser.html',context)
39 |
40 | '''
41 | Update User
42 |
43 | '''
44 | class UpdateUser(SuccessMessageMixin, UpdateView):
45 | model = User
46 | template_name = 'auth/user_form.html'
47 | form_class = UserUpdateForm
48 | success_url = '/users'
49 | success_message = 'User updated successfully'
50 | error_message = 'User not updated'
51 |
52 | '''
53 | Delete User
54 |
55 | '''
56 | def delete_user(request,pk):
57 | User.objects.get(id=pk).delete()
58 | return redirect('user')
59 |
60 |
61 | '''
62 | login user
63 |
64 | '''
65 | @auth_user
66 | def loginView(request):
67 | if request.method == 'POST':
68 | email = request.POST.get('email')
69 | password = request.POST.get('password')
70 |
71 | user = authenticate(email=email,password=password)
72 | if user is not None:
73 | login(request,user)
74 | if "next" in request.POST:
75 | return redirect(request.POST['next'])
76 | return redirect('dashboard:dashboard')
77 | return render(request,'auth/login.html')
78 |
79 |
80 | '''
81 | log out user
82 |
83 | '''
84 | def logoutView(request):
85 | logout(request)
86 | return redirect('/')
87 |
88 | '''
89 | profile view
90 |
91 | '''
92 | class ProfileView(View):
93 | def get(self,request):
94 | user = request.user.id
95 | user_data = Profile.objects.get(user=user)
96 | context = {
97 | 'user_data':user_data
98 | }
99 | return render(request, 'users/profile.html',context)
100 |
--------------------------------------------------------------------------------
/apps/users/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | import apps.users.models
4 | from django.conf import settings
5 | from django.db import migrations, models
6 | import django.db.models.deletion
7 |
8 |
9 | class Migration(migrations.Migration):
10 |
11 | initial = True
12 |
13 | dependencies = [
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='User',
19 | fields=[
20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('password', models.CharField(max_length=128, verbose_name='password')),
22 | ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
23 | ('email', models.EmailField(max_length=245, unique=True)),
24 | ('first_name', models.CharField(max_length=245)),
25 | ('last_name', models.CharField(max_length=245)),
26 | ('gender', models.CharField(max_length=245)),
27 | ('owner', models.BooleanField(default=False)),
28 | ('employs', models.BooleanField(default=False)),
29 | ('staff', models.BooleanField(default=False)),
30 | ('admin', models.BooleanField(default=False)),
31 | ('created', models.DateTimeField(auto_now_add=True)),
32 | ('updated', models.DateTimeField(auto_now=True)),
33 | ],
34 | options={
35 | 'abstract': False,
36 | },
37 | ),
38 | migrations.CreateModel(
39 | name='Profile',
40 | fields=[
41 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
42 | ('name', models.CharField(max_length=245)),
43 | ('gender', models.CharField(max_length=10)),
44 | ('img', models.ImageField(blank=True, null=True, upload_to=apps.users.models.img_uploader)),
45 | ('bio', models.CharField(blank=True, max_length=245, null=True)),
46 | ('created', models.DateTimeField(auto_now_add=True)),
47 | ('updated', models.DateTimeField(auto_now=True)),
48 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
49 | ],
50 | options={
51 | 'verbose_name': 'Profile',
52 | 'verbose_name_plural': 'Profiles',
53 | 'ordering': ['-id'],
54 | },
55 | ),
56 | ]
57 |
--------------------------------------------------------------------------------
/apps/accountants/templates/dashboard/dashboard.html:
--------------------------------------------------------------------------------
1 | {% extends 'dashboard/baseDashboard.html' %}
2 | {% load crispy_forms_tags %}
3 | {% block title %}Dashboard{% endblock title %}
4 | {% block dashboard %}
5 |
6 |
7 |
Business details
8 | earn: {{earn}}/= tk
9 | invest: {{invest}}/= tk
10 | profit: {{profit}}/= tk
11 | loss: {{loss}}/= tk
12 |
13 |
14 |
15 |
16 |
Billing Details
17 | total_bill: {{total_bill}}
18 | earn_via_bill: {{earn_via_bill}}
19 | up_steam_bill: {{up_steam_bill}}
20 |
21 |
22 |
23 |
Clients
24 | total clients: {{clients}}
25 | active clients: {{active_clients}}
26 | inactive clients: {{inactive_clients}}
27 |
28 |
29 |
30 |
Onu Details
31 | total onu: {{total_onu}}
32 | active onu: {{active_onu}}
33 | stored onu: {{stored_onu}}
34 | damaged onu: {{damaged_onu}}
35 |
36 |
37 |
38 |
Employ details
39 | total Employ: {{total_employ}}
40 | active Employ: {{active_employ}}
41 | stored Employ: {{inactive_employ}}
42 |
43 |
44 |
Task Basket
45 | total basket: {{total_basket}}
46 | pending basket: {{pending_basket}}
47 | in progress basket: {{in_progress_basket}}
48 | completed basket: {{completed_basket}}
49 |
50 |
51 | {% endblock %}
--------------------------------------------------------------------------------
/apps/users/forms.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django import forms
3 | from django.contrib.auth import get_user_model
4 | from django.contrib.auth.forms import ReadOnlyPasswordHashField
5 |
6 | # user register form
7 | User = get_user_model()
8 |
9 |
10 | class RegisterForm(forms.ModelForm):
11 | # password input
12 | password = forms.CharField(widget=forms.PasswordInput())
13 | password2 = forms.CharField(
14 | widget=forms.PasswordInput(), label='Confirm Password')
15 |
16 | # selecting Model
17 | class Meta:
18 | model = User
19 | fields = [
20 | 'email', 'first_name', 'last_name', 'gender'
21 | ]
22 |
23 | # password matching and returning password
24 | def clean(self):
25 | cleaned_data = super().clean()
26 | password1 = cleaned_data.get('password')
27 | password2 = cleaned_data.get('password2')
28 | if password1 is not None and password1 != password2:
29 | self.add_error("password2", "Your passwords must match")
30 |
31 | return cleaned_data
32 |
33 | # set password
34 | def save(self, commit=True):
35 | user = super(RegisterForm, self).save(commit=False)
36 | user.set_password(self.cleaned_data['password2'])
37 | if commit:
38 | user.save()
39 | return user
40 |
41 | # super user crete form
42 |
43 |
44 | class UserAdminCreationForm(forms.ModelForm):
45 | # password input
46 | password = forms.CharField(widget=forms.PasswordInput())
47 | password2 = forms.CharField(
48 | widget=forms.PasswordInput(), label='Confirm Password')
49 |
50 | # selecting Model
51 | class Meta:
52 | model = User
53 | fields = ['email']
54 |
55 | # password matching and returning password
56 | def clean(self):
57 | cleaned_data = super().clean()
58 | password1 = cleaned_data.get('password')
59 | password2 = cleaned_data.get('password2')
60 | if password1 is not None and password1 != password2:
61 | self.add_error("password2", "Your passwords must match")
62 |
63 | return cleaned_data
64 |
65 | # set password
66 | def save(self, commit=True):
67 | user = super().save(commit=False)
68 | user.set_password(self.cleaned_data['password2'])
69 | if commit:
70 | user.save()
71 | return user
72 |
73 |
74 | # user admin change form
75 | class UserAdminChangeForm(forms.ModelForm):
76 | password = ReadOnlyPasswordHashField()
77 |
78 | class Meta:
79 | model = User
80 | fields = ['email', 'password', 'admin']
81 |
82 | def clean_password(self):
83 | # Regardless of what the user provides, return the initial value.
84 | # This is done here, rather than on the field, because the
85 | # field does not have access to the initial value
86 | return self.initial["password"]
87 |
88 | # user update from
89 | class UserUpdateForm(forms.ModelForm):
90 | class Meta:
91 | model = User
92 | fields = ['first_name','last_name','email', 'owner', 'employs']
93 |
--------------------------------------------------------------------------------
/apps/users/models.py:
--------------------------------------------------------------------------------
1 | # imports
2 | import os
3 | import pathlib
4 |
5 | from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
6 | from django.db import models
7 |
8 |
9 | # user manager
10 | class UserManager(BaseUserManager):
11 | # create user
12 | def create_user(self, email, password=None):
13 | if not email:
14 | raise ValueError('Enter a valid email')
15 |
16 | user = self.model(email=self.normalize_email(email))
17 | user.set_password(password)
18 | user.save(using=self._db)
19 | return user
20 |
21 | # create staff user
22 | def create_staffuser(self, email, password=None):
23 | user = self.create_user(email, password)
24 | user.staff = True
25 | user.save(using=self._db)
26 | return user
27 |
28 | # create super user / admin
29 | def create_superuser(self, email, password=None):
30 | user = self.create_user(email, password)
31 | user.staff = True
32 | user.admin = True
33 | user.owner = True
34 | user.save(using=self._db)
35 | return user
36 |
37 | # user model
38 | class User(AbstractBaseUser):
39 | email = models.EmailField(max_length=245, unique=True)
40 | first_name = models.CharField(max_length=245)
41 | last_name = models.CharField(max_length=245)
42 | gender = models.CharField(max_length=245)
43 | owner = models.BooleanField(default=False)
44 | employs = models.BooleanField(default=False)
45 | staff = models.BooleanField(default=False)
46 | admin = models.BooleanField(default=False)
47 | created = models.DateTimeField(auto_now_add=True)
48 | updated = models.DateTimeField(auto_now=True)
49 |
50 | # username replaced with email
51 | USERNAME_FIELD = 'email'
52 | REQUIRED_FIELDS = []
53 |
54 | objects = UserManager()
55 |
56 | def __str__(self):
57 | return self.email
58 |
59 | def has_perm(self, perm, obj=None):
60 | return True
61 |
62 | def has_module_perms(self, app_label):
63 | return True
64 |
65 | @property
66 | def is_staff(self):
67 | if self.staff == True:
68 | return True
69 | else:
70 | return False
71 |
72 | @property
73 | def is_superuser(self):
74 | if self.admin == True:
75 | return True
76 | else:
77 | return False
78 |
79 |
80 | # img rename
81 | def img_uploader(instance,filename):
82 | # fpath = pathlib.Path(filename)
83 | # new_fname = str(instance.user)
84 | # file
85 | return os.path.join('profiles_img', instance.user.email,filename)
86 |
87 | # Profile Model
88 | class Profile(models.Model):
89 | user = models.OneToOneField(User, on_delete=models.CASCADE)
90 | name = models.CharField(max_length=245)
91 | gender = models.CharField(max_length=10)
92 | img = models.ImageField(upload_to=img_uploader, null=True, blank=True)
93 | bio = models.CharField(max_length=245, null=True, blank=True)
94 | created = models.DateTimeField(auto_now_add=True)
95 | updated = models.DateTimeField(auto_now=True)
96 |
97 | def __str__(self):
98 | return self.name
99 |
100 | class Meta:
101 | verbose_name = 'Profile'
102 | verbose_name_plural = 'Profiles'
103 | ordering = ['-id']
104 |
--------------------------------------------------------------------------------
/apps/accountants/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 4.1.1 on 2023-01-15 04:26
2 |
3 | from django.conf import settings
4 | from django.db import migrations, models
5 | import django.db.models.deletion
6 |
7 |
8 | class Migration(migrations.Migration):
9 |
10 | initial = True
11 |
12 | dependencies = [
13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL),
14 | ]
15 |
16 | operations = [
17 | migrations.CreateModel(
18 | name='Commission',
19 | fields=[
20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
21 | ('profit', models.FloatField()),
22 | ],
23 | ),
24 | migrations.CreateModel(
25 | name='CompanyProfile',
26 | fields=[
27 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
28 | ('name', models.CharField(max_length=245)),
29 | ('city', models.CharField(max_length=245)),
30 | ('state', models.CharField(max_length=245)),
31 | ('country', models.CharField(max_length=245)),
32 | ],
33 | ),
34 | migrations.CreateModel(
35 | name='Wrapper',
36 | fields=[
37 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
38 | ('created_at', models.DateTimeField(auto_now_add=True)),
39 | ('updated_at', models.DateTimeField(auto_now=True)),
40 | ],
41 | ),
42 | migrations.CreateModel(
43 | name='Earning',
44 | fields=[
45 | ('wrapper_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='accountants.wrapper')),
46 | ('earning_details', models.CharField(max_length=500)),
47 | ('earning_amount', models.IntegerField()),
48 | ],
49 | bases=('accountants.wrapper',),
50 | ),
51 | migrations.CreateModel(
52 | name='Invest',
53 | fields=[
54 | ('wrapper_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='accountants.wrapper')),
55 | ('invest_details', models.CharField(max_length=500)),
56 | ('invest_amount', models.IntegerField()),
57 | ],
58 | bases=('accountants.wrapper',),
59 | ),
60 | migrations.CreateModel(
61 | name='Owner',
62 | fields=[
63 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
64 | ('name', models.CharField(max_length=150)),
65 | ('Commission', models.IntegerField()),
66 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='Owner', to=settings.AUTH_USER_MODEL)),
67 | ],
68 | ),
69 | ]
70 |
--------------------------------------------------------------------------------
/apps/employ/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.shortcuts import render
6 | from django.utils.decorators import method_decorator
7 | from django.views import View
8 | from django.views.generic import CreateView, DeleteView, UpdateView
9 |
10 | from .filters import EmployFilter
11 | from .forms import EmployCategoryForm, EmployForm
12 | from .models import Employ, EmployCategory
13 |
14 |
15 | # Employ Management panel
16 | @method_decorator(login_required(login_url='login'), name='dispatch')
17 | class EmployView(View):
18 | def get(self, request):
19 | employs = Employ.objects.all()
20 | filters = EmployFilter(request.GET, queryset=employs)
21 | employs = filters.qs
22 | paginator = Paginator(employs, 25)
23 | page_number = request.GET.get('paginator')
24 | employs = paginator.get_page(page_number)
25 | context = {
26 | 'employs':employs,'filters':filters
27 | }
28 | return render(request, 'dashboard/employ/employ.html', context)
29 |
30 | # Employ Create View
31 | @method_decorator(login_required(login_url='login'), name='dispatch')
32 | class EmployCreate(SuccessMessageMixin,CreateView):
33 | form_class = EmployForm
34 | template_name = 'dashboard/employ/employ_form.html'
35 | success_url = '/dashboard/employ'
36 | success_message = 'Employ created'
37 | error_message = 'Employ not created'
38 |
39 |
40 | # Employ Update View
41 | @method_decorator(login_required(login_url='login'), name='dispatch')
42 | class UpdateEmploy(SuccessMessageMixin,UpdateView):
43 | model = Employ
44 | form_class = EmployForm
45 | template_name = 'dashboard/employ/employ_form.html'
46 | success_url = '/dashboard/employ'
47 | success_message = 'Employ updated'
48 | error_message = 'Employ not updated'
49 |
50 | # Employ Delete View
51 | @method_decorator(login_required(login_url='login'), name='dispatch')
52 | class EmployDelete(SuccessMessageMixin,DeleteView):
53 | model = Employ
54 | template_name = 'dashboard/employ/employ_delete_confirm.html'
55 | success_url = '/dashboard/employ'
56 | success_message = 'Employ deleted'
57 | error_message = 'Employ not deleted'
58 |
59 |
60 | # Employ Category Management panel
61 | @method_decorator(login_required(login_url='login'), name='dispatch')
62 | class EmployCategoryView(View):
63 | def get(self, request):
64 | categories = EmployCategory.objects.all()
65 | paginator = Paginator(categories, 25)
66 | page_number = request.GET.get('paginator')
67 | categories = paginator.get_page(page_number)
68 | context = {
69 | 'categories':categories
70 | }
71 | return render(request, 'dashboard/employ/employ_category.html', context)
72 |
73 | # Employ Category Create View
74 | @method_decorator(login_required(login_url='login'), name='dispatch')
75 | class EmployCategoryCreate(SuccessMessageMixin,CreateView):
76 | form_class = EmployCategoryForm
77 | template_name = 'dashboard/employ/employ_category_form.html'
78 | success_url = '/dashboard/employ/category'
79 | success_message = 'Employ created'
80 | error_message = 'Employ not created'
81 |
82 |
83 | # Employ Category Update View
84 | @method_decorator(login_required(login_url='login'), name='dispatch')
85 | class UpdateCategoryEmploy(SuccessMessageMixin,UpdateView):
86 | model = EmployCategory
87 | form_class = EmployCategoryForm
88 | template_name = 'dashboard/employ/employ_category_form.html'
89 | success_url = '/dashboard/employ/category'
90 | success_message = 'Employ updated'
91 | error_message = 'Employ not updated'
92 |
93 | # Employ Category Delete View
94 | @method_decorator(login_required(login_url='login'), name='dispatch')
95 | class EmployCategoryDelete(SuccessMessageMixin,DeleteView):
96 | model = EmployCategory
97 | template_name = 'dashboard/employ/employ_category_delete_form.html'
98 | success_url = '/dashboard/employ/category'
99 | success_message = 'Employ deleted'
100 | error_message = 'Employ not deleted'
101 |
--------------------------------------------------------------------------------
/isp_management/settings.py:
--------------------------------------------------------------------------------
1 | # imports
2 | import os
3 | from pathlib import Path
4 |
5 | from decouple import config
6 |
7 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
8 | BASE_DIR = Path(__file__).resolve().parent.parent
9 |
10 |
11 | # Quick-start development settings - unsuitable for production
12 | # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
13 |
14 | # SECURITY WARNING: keep the secret key used in production secret!
15 | SECRET_KEY = config('SECRET_KEY')
16 |
17 | # SECURITY WARNING: don't run with debug turned on in production!
18 | DEBUG = config('DEBUG')
19 |
20 | ALLOWED_HOSTS = ['*']
21 |
22 |
23 | # Application definition
24 |
25 | INSTALLED_APPS = [
26 | 'django.contrib.admin',
27 | 'django.contrib.auth',
28 | 'django.contrib.contenttypes',
29 | 'django.contrib.sessions',
30 | 'django.contrib.messages',
31 | 'django.contrib.staticfiles',
32 | 'crispy_forms',
33 | 'django_filters',
34 | # Custom applications
35 | 'apps.users.apps.UsersConfig',
36 | 'apps.employ',
37 | 'apps.packages',
38 | 'apps.onu',
39 | 'apps.pop',
40 | 'apps.warehouse',
41 | 'apps.tasks',
42 | 'apps.clients',
43 | 'apps.accountants',
44 |
45 | ]
46 |
47 | # user model
48 | AUTH_USER_MODEL = 'users.User'
49 |
50 | MIDDLEWARE = [
51 | 'django.middleware.security.SecurityMiddleware',
52 | 'django.contrib.sessions.middleware.SessionMiddleware',
53 | 'django.middleware.common.CommonMiddleware',
54 | 'django.middleware.csrf.CsrfViewMiddleware',
55 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
56 | 'django.contrib.messages.middleware.MessageMiddleware',
57 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
58 | ]
59 |
60 | ROOT_URLCONF = 'isp_management.urls'
61 |
62 | TEMPLATES = [
63 | {
64 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
65 | 'DIRS': [BASE_DIR / 'templates'],
66 | 'APP_DIRS': True,
67 | 'OPTIONS': {
68 | 'context_processors': [
69 | 'django.template.context_processors.debug',
70 | 'django.template.context_processors.request',
71 | 'django.contrib.auth.context_processors.auth',
72 | 'django.contrib.messages.context_processors.messages',
73 | 'apps.accountants.context_processors.company_profile',
74 | ],
75 | },
76 | },
77 | ]
78 |
79 | WSGI_APPLICATION = 'isp_management.wsgi.application'
80 |
81 |
82 | # Database
83 | # https://docs.djangoproject.com/en/4.0/ref/settings/#databases
84 |
85 | DATABASES = {
86 | 'default': {
87 | 'ENGINE': 'django.db.backends.sqlite3',
88 | 'NAME': BASE_DIR / 'db.sqlite3',
89 | }
90 | }
91 |
92 |
93 | # Password validation
94 | # https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
95 |
96 | AUTH_PASSWORD_VALIDATORS = [
97 | {
98 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
99 | },
100 | {
101 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
102 | },
103 | {
104 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
105 | },
106 | {
107 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
108 | },
109 | ]
110 |
111 |
112 | # Internationalization
113 | # https://docs.djangoproject.com/en/4.0/topics/i18n/
114 |
115 | LANGUAGE_CODE = 'en-us'
116 |
117 | TIME_ZONE = 'Asia/Dhaka'
118 |
119 | USE_I18N = True
120 |
121 | USE_TZ = True
122 |
123 |
124 | # Static files (CSS, JavaScript, Images)
125 | # https://docs.djangoproject.com/en/4.0/howto/static-files/
126 |
127 |
128 | STATIC_URL = '/static/'
129 | # STATICFILES_DIRS =[ os.path.join(BASE_DIR, 'static')]
130 | STATIC_ROOT = os.path.join(BASE_DIR, 'static')
131 |
132 | # Media files settings
133 |
134 | MEDIA_URL = '/media/'
135 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
136 |
137 | # Default primary key field type
138 | # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
139 |
140 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
141 |
--------------------------------------------------------------------------------
/apps/warehouse/views.py:
--------------------------------------------------------------------------------
1 | from django.contrib.auth.decorators import login_required
2 | from django.contrib.messages.views import SuccessMessageMixin
3 | from django.core.paginator import Paginator
4 | from django.shortcuts import render
5 | from django.utils.decorators import method_decorator
6 | from django.views import View
7 | from django.views.generic import CreateView, DeleteView, UpdateView
8 |
9 | from .filters import CategoryFilter, WarehouseFilter
10 | from .forms import WarehouseCategoryForm, WarehouseProductForm
11 | from .models import Warehouse, WarehouseCategory
12 |
13 |
14 | # warehouse category
15 | # warehouse category list
16 | @method_decorator(login_required(login_url='login'), name='dispatch')
17 | class WarehouseCategoryList(View):
18 | def get(self,request):
19 | categories = WarehouseCategory.objects.all()
20 | filters = CategoryFilter(request.GET, queryset=categories)
21 | categories = filters.qs
22 | paginator = Paginator(categories, 25)
23 | page_number = request.GET.get('paginator')
24 | categories = paginator.get_page(page_number)
25 | context = {
26 | 'categories':categories, 'filters':filters
27 | }
28 | return render(request, 'warehouse/category.html', context)
29 |
30 | # create warehouse category
31 | @method_decorator(login_required(login_url='login'), name='dispatch')
32 | class WarehouseCreateCategory(SuccessMessageMixin, CreateView):
33 | form_class = WarehouseCategoryForm
34 | template_name = 'warehouse/create_category.html'
35 | success_url = '/warehouse/categories'
36 | success_message = 'category created'
37 | error_message = 'failed category creating'
38 |
39 | # update warehouse category
40 | @method_decorator(login_required(login_url='login'), name='dispatch')
41 | class WarehouseUpdateCategory(SuccessMessageMixin, UpdateView):
42 | model = WarehouseCategory
43 | form_class = WarehouseCategoryForm
44 | template_name = 'warehouse/create_category.html'
45 | success_url = '/warehouse/categories'
46 | success_message = 'category updated'
47 | error_message = 'failed category updating'
48 |
49 | # delete warehouse category
50 | @method_decorator(login_required(login_url='login'), name='dispatch')
51 | class WarehouseDeleteCategory(SuccessMessageMixin,DeleteView):
52 | model = WarehouseCategory
53 | template_name = 'warehouse/category_delete_confirm.html'
54 | success_url = '/warehouse/categories'
55 | success_message = 'category deleted'
56 | error_message = 'failed category deleting'
57 |
58 |
59 |
60 | # warehouse product
61 | # warehouse product list
62 | @method_decorator(login_required(login_url='login'), name='dispatch')
63 | class WarehouseProductList(View):
64 | def get(self,request):
65 | products = Warehouse.objects.all()
66 | filters = WarehouseFilter(request.GET, queryset=products)
67 | products = filters.qs
68 | paginator = Paginator(products, 25)
69 | page_number = request.GET.get('paginator')
70 | products = paginator.get_page(page_number)
71 | context = {
72 | 'products':products, 'filters':filters
73 | }
74 | return render(request, 'warehouse/warehouse.html', context)
75 |
76 |
77 | # warehouse product create
78 | @method_decorator(login_required(login_url='login'), name='dispatch')
79 | class WarehouseProductCreate(SuccessMessageMixin,CreateView):
80 | form_class = WarehouseProductForm
81 | template_name = 'warehouse/warehouse_create.html'
82 | success_url = '/warehouse'
83 | success_message = 'product created'
84 | error_message = 'product creating failed'
85 |
86 | # warehouse product update
87 | @method_decorator(login_required(login_url='login'), name='dispatch')
88 | class WarehouseProductUpdate(SuccessMessageMixin,UpdateView):
89 | model = Warehouse
90 | form_class = WarehouseProductForm
91 | template_name = 'warehouse/warehouse_create.html'
92 | success_url = '/warehouse'
93 | success_message = 'product updated'
94 | error_message = 'product updating failed'
95 |
96 |
97 | # warehouse delete product
98 | @method_decorator(login_required(login_url='login'), name='dispatch')
99 | class WarehouseProductDelete(SuccessMessageMixin,DeleteView):
100 | model = Warehouse
101 | template_name = 'warehouse/warehouse_delete_confirm.html'
102 | success_url = '/warehouse'
103 | success_message = 'product deleted'
104 | error_message = 'product deleting failed'
105 |
--------------------------------------------------------------------------------
/apps/tasks/views.py:
--------------------------------------------------------------------------------
1 | # Create your views here.
2 | from django.contrib.auth.decorators import login_required
3 | from django.contrib.messages.views import SuccessMessageMixin
4 | from django.core.paginator import Paginator
5 | from django.db.models import Sum
6 | from django.shortcuts import redirect, render
7 | from django.utils.decorators import method_decorator
8 | from django.views import View
9 | from django.views.generic import CreateView, DeleteView, UpdateView
10 |
11 | from .filters import TaskFilter
12 | from .forms import TaskCategoryForm, TasksForm
13 | from .models import TaskCategory, Tasks
14 |
15 | # Create your views here.
16 |
17 | # Task lists
18 | @method_decorator(login_required(login_url='login'), name='dispatch')
19 | class TasksView(View):
20 | def get(self,request):
21 | tasks = Tasks.objects.all()
22 | filters = TaskFilter(request.GET, queryset=tasks)
23 | tasks = filters.qs
24 | paginator = Paginator(tasks, 25)
25 | page_number = request.GET.get('paginator')
26 | tasks = paginator.get_page(page_number)
27 | context = {
28 | 'tasks':tasks,'filters':filters
29 | }
30 | return render(request, 'tasks/tasks.html', context)
31 |
32 |
33 | # tasks Create view
34 | @login_required(login_url='login')
35 | def createTasks(request):
36 | form = TasksForm()
37 | if request.method == 'POST':
38 | form = TasksForm(request.POST)
39 | if form.is_valid():
40 | obj = form.save(commit=False)
41 | task_id = Tasks.objects.aggregate(Sum('task_token'))['task_token__sum'] + 1 if Tasks.objects.aggregate(Sum('task_token'))['task_token__sum'] else 100000
42 | obj.task_token = task_id
43 | obj.save()
44 | return redirect('tasks:tasks')
45 |
46 | context = {
47 | 'form':form
48 | }
49 | return render(request,'tasks/task_form.html',context)
50 |
51 | # tasks Update View
52 | @method_decorator(login_required(login_url='login'), name='dispatch')
53 | class UpdateTasks(SuccessMessageMixin,UpdateView):
54 | model = Tasks
55 | form_class = TasksForm
56 | template_name = 'tasks/task_form.html'
57 | success_url = '/tasks'
58 | success_message ='new tasks updated'
59 | error_message ='tasks not updated'
60 |
61 |
62 | # tasks Delete View
63 | @method_decorator(login_required(login_url='login'), name='dispatch')
64 | class DeleteTasks(SuccessMessageMixin,DeleteView):
65 | model = Tasks
66 | template_name = 'tasks/tasks_delete.html'
67 | success_url = '/tasks'
68 | success_message ='tasks deleted'
69 | error_message ='tasks not deleted'
70 |
71 |
72 | # Task category lists
73 | @method_decorator(login_required(login_url='login'), name='dispatch')
74 | class TasksCategoryView(View):
75 | def get(self,request):
76 | taskCategory = TaskCategory.objects.all()
77 | filters = TaskFilter(request.GET, queryset=taskCategory)
78 | taskCategory = filters.qs
79 | paginator = Paginator(taskCategory, 25)
80 | page_number = request.GET.get('paginator')
81 | taskCategory = paginator.get_page(page_number)
82 | context = {
83 | 'taskCategory':taskCategory,'filters':filters
84 | }
85 | return render(request, 'taskCategory/taskCategory.html', context)
86 |
87 |
88 | # tasks Create view
89 | @method_decorator(login_required(login_url='login'), name='dispatch')
90 | class CreateTasksCategory(SuccessMessageMixin,CreateView):
91 | form_class = TaskCategoryForm
92 | template_name = 'taskCategory/tasksCategory_form.html'
93 | success_url = '/tasks/taskCategory'
94 | success_message ='task category created'
95 | error_message ='task category not created'
96 |
97 | # tasks Update View
98 | @method_decorator(login_required(login_url='login'), name='dispatch')
99 | class UpdateTasksCategory(SuccessMessageMixin,UpdateView):
100 | model= TaskCategory
101 | form_class = TaskCategoryForm
102 | template_name = 'taskCategory/tasksCategory_form.html'
103 | success_url = '/tasks/taskCategory'
104 | success_message ='task category updated'
105 | error_message ='task category not updated'
106 |
107 |
108 | # tasks Delete View
109 | @method_decorator(login_required(login_url='login'), name='dispatch')
110 | class DeleteTasksCategory(SuccessMessageMixin,DeleteView):
111 | model = TaskCategory
112 | template_name = 'taskCategory/tasksCategory_delete.html'
113 | success_url = '/tasks/taskCategory'
114 | success_message ='task category deleted'
115 | error_message ='task category not deleted'
116 |
--------------------------------------------------------------------------------
/templates/base.html:
--------------------------------------------------------------------------------
1 |
2 | {% load static %}
3 |
4 |
5 |
6 |
7 |
8 |
9 | kaliganj net:: {% block title %}{% endblock title %}
10 | {% comment %} bootstrap {% endcomment %}
11 |
13 |
14 | {% comment %} base css {% endcomment %}
15 |
16 | {% comment %} extra head block {% endcomment %}
17 | {% block extraHead %}{% endblock extraHead %}
18 | {% block dashHead %}{% endblock dashHead %}
19 |
20 |
21 |
22 | {% comment %} navbar area starts here {% endcomment %}
23 |
59 | {% comment %} navbar area ends here {% endcomment %}
60 | {% if messages %}
61 | {% for message in messages %}
62 |
63 |
67 |
68 | {{message}}
69 |
70 |
71 | {% endfor %}
72 | {% endif %}
73 |
74 |
75 | {% block content %}{% endblock content %}
76 |
77 |
78 |
79 |
80 |
83 |
86 |
89 |
90 |
91 |
92 |
99 |
100 |
--------------------------------------------------------------------------------
/apps/accountants/views.py:
--------------------------------------------------------------------------------
1 | # imports
2 | from datetime import datetime
3 |
4 | from django.contrib.auth.decorators import login_required
5 | from django.contrib.messages.views import SuccessMessageMixin
6 | from django.core.paginator import Paginator
7 | from django.db.models import Sum
8 | from django.shortcuts import render
9 | from django.utils.decorators import method_decorator
10 | from django.views import View
11 | from django.views.generic import CreateView, DeleteView, UpdateView
12 |
13 | from apps.clients.models import Clients
14 | from apps.employ.models import Employ
15 | from apps.onu.models import Onu
16 | from apps.tasks.models import Tasks
17 | from apps.warehouse.models import Warehouse
18 |
19 | from .decorator import owner_roles
20 | from .filters import EarningFilter, InvestFilter, OwnerFilter
21 | from .forms import (CommissionForm, CompanyProfileForm, EarningForm,
22 | InvestForm, OwnerForm)
23 | from .models import Commission, CompanyProfile, Earning, Invest, Owner
24 |
25 |
26 | # Owner Dashboard
27 | @method_decorator(login_required(login_url='login'), name='dispatch')
28 | @method_decorator(owner_roles, name='dispatch')
29 | class OwnerDashboard(View):
30 | def get(self, request):
31 | # * profit details
32 | earn = Earning.objects.aggregate(Sum('earning_amount'))['earning_amount__sum'] if Earning.objects.all().exists() else 0
33 | invest = Invest.objects.aggregate(Sum('invest_amount'))['invest_amount__sum'] if Invest.objects.all().exists() else 0
34 |
35 | def profit_calculator(invest, earn):
36 | if invest > earn:
37 | return 0
38 | else:
39 | return earn - invest
40 |
41 | # loss calculator
42 | def loss_calculator(invest, earn):
43 | if invest < earn:
44 | return 0
45 | else:
46 | return invest - earn
47 |
48 | profit = profit_calculator(invest,earn)
49 | loss = loss_calculator(invest,earn)
50 |
51 | def create_commission():
52 | Commission.objects.create(profit=20)
53 | return Commission.objects.get(id=1)
54 |
55 | # * billing details
56 | total_bill = Clients.objects.filter(status='active').aggregate(Sum('pack__price'))['pack__price__sum'] if Clients.objects.filter(status='active').exists() else 0
57 | commission = Commission.objects.get(id=1) if Commission.objects.all().exists() else create_commission()
58 | earn_via_bill = (total_bill * commission.profit) / 100
59 | up_steam_bill = total_bill - earn_via_bill
60 |
61 | # * clients details
62 | clients = Clients.objects.all().count() if Clients.objects.all().exists() else 0
63 | active_clients = Clients.objects.filter(status='active').count() if Clients.objects.filter(status='active').exists() else 0
64 | inactive_clients = Clients.objects.filter(status='inactive').count() if Clients.objects.filter(status='inactive').exists() else 0
65 |
66 | # * Onu details
67 | total_onu = Onu.objects.all().count() if Onu.objects.all().exists() else 0
68 | active_onu = Onu.objects.filter(status='Active').count() if Onu.objects.filter(status='Active').exists() else 0
69 | stored_onu = Onu.objects.filter(status='Stored').count() if Onu.objects.filter(status='Stored').exists() else 0
70 | damaged_onu = Onu.objects.filter(status='Damaged').count() if Onu.objects.filter(status='Damaged').exists() else 0
71 |
72 | # * employ details
73 | total_employ = Employ.objects.all().count() if Employ.objects.all().exists() else 0
74 | active_employ = Employ.objects.filter(status='active').count() if Employ.objects.filter(status='active').exists() else 0
75 | inactive_employ = Employ.objects.filter(status='inactive').count() if Employ.objects.filter(status='inactive').exists() else 0
76 |
77 | # * task details
78 | total_basket = Tasks.objects.all().count() if Tasks.objects.all().exists() else 0
79 | pending_basket = Tasks.objects.filter(status='pending').count() if Tasks.objects.filter(status='pending').exists() else 0
80 | in_progress_basket = Tasks.objects.filter(status='in progress').count() if Tasks.objects.filter(status='in progress').exists() else 0
81 | completed_basket = Tasks.objects.filter(status='complete').count() if Tasks.objects.filter(status='complete').exists() else 0
82 |
83 | context = {
84 | # profit details
85 | 'earn':earn,
86 | 'invest':invest,
87 | 'profit':profit,
88 | 'loss':loss,
89 | 'total_bill':total_bill,
90 | 'up_steam_bill':up_steam_bill,
91 | 'earn_via_bill':earn_via_bill,
92 |
93 | # clients details
94 | 'clients':clients,
95 | 'active_clients':active_clients,
96 | 'inactive_clients':inactive_clients,
97 |
98 | # onu details
99 | 'total_onu':total_onu,
100 | 'active_onu':active_onu,
101 | 'stored_onu':stored_onu,
102 | 'damaged_onu':damaged_onu,
103 |
104 | # employ details
105 | 'total_employ':total_employ,
106 | 'active_employ':active_employ,
107 | 'inactive_employ':inactive_employ,
108 |
109 | # task basket
110 | 'total_basket':total_basket,
111 | 'pending_basket':pending_basket,
112 | 'in_progress_basket':in_progress_basket,
113 | 'completed_basket':completed_basket,
114 | }
115 | return render(request, 'dashboard/dashboard.html',context)
116 |
117 |
118 |
119 | # owners view
120 | @method_decorator(login_required(login_url='login'), name='dispatch')
121 | class OwnerView(View):
122 | def get(self, request):
123 | owners = Owner.objects.all()
124 | filters = OwnerFilter(request.GET, queryset=owners)
125 | paginator = Paginator(filters.qs, 7)
126 | page_number = request.GET.get('paginator')
127 | owners = paginator.get_page(page_number)
128 | context = {
129 | 'owners':owners, 'filters':filters
130 | }
131 | return render(request, 'dashboard/owner/owner.html', context)
132 |
133 | # owner create view
134 | @method_decorator(login_required(login_url='login'), name='dispatch')
135 | class OwnerCreate(SuccessMessageMixin,CreateView):
136 | form_class = OwnerForm
137 | template_name = 'dashboard/owner/owner_form.html'
138 | success_url = '/dashboard/owners'
139 | success_message = 'owner created'
140 | error_message = 'owner not created'
141 |
142 | # owner update view
143 | @method_decorator(login_required(login_url='login'), name='dispatch')
144 | class OwnerUpdate(SuccessMessageMixin,UpdateView):
145 | model = Owner
146 | form_class = OwnerForm
147 | template_name = 'dashboard/owner/owner_form.html'
148 | success_url = '/dashboard/owners'
149 | success_message = 'owner updated'
150 | error_message = 'owner not updated'
151 |
152 | # owner delete view
153 | @method_decorator(login_required(login_url='login'), name='dispatch')
154 | class OwnerDelete(SuccessMessageMixin,DeleteView):
155 | model = Owner
156 | template_name = 'dashboard/owner/owner_delete_confirm.html'
157 | success_url = '/dashboard/owners'
158 | success_message = 'owner deleted'
159 | error_message = 'owner not deleted'
160 |
161 | # invest view
162 | @method_decorator(login_required(login_url='login'), name='dispatch')
163 | class InvestView(View):
164 | def get(self, request,):
165 | invests = Invest.objects.all()
166 | filters = InvestFilter(request.GET, queryset=invests)
167 | paginator = Paginator(filters.qs, 25)
168 | page_number = request.GET.get('paginator')
169 | invests = paginator.get_page(page_number)
170 | context = {
171 | 'invests':invests, 'filters':filters
172 | }
173 | return render(request, 'dashboard/invest/invest.html', context)
174 |
175 | # invest create view
176 | @method_decorator(login_required(login_url='login'), name='dispatch')
177 | class InvestCreateView(SuccessMessageMixin,CreateView):
178 | form_class = InvestForm
179 | template_name = 'dashboard/invest/invest_form.html'
180 | success_message = 'Invest Details Created'
181 | error_message = 'Invest Details Not Created'
182 | success_url = '/dashboard/invest'
183 |
184 | # invest update view
185 | @method_decorator(login_required(login_url='login'), name='dispatch')
186 | class InvestUpdateView(SuccessMessageMixin,UpdateView):
187 | model = Invest
188 | form_class = InvestForm
189 | template_name = 'dashboard/invest/invest_form.html'
190 | success_message = 'Invest Details updated'
191 | error_message = 'Invest Details Not updated'
192 | success_url = '/dashboard/invest'
193 |
194 | # invest delete view
195 | @method_decorator(login_required(login_url='login'), name='dispatch')
196 | class InvestDelete(SuccessMessageMixin,DeleteView):
197 | model = Invest
198 | template_name = 'dashboard/invest/invest_delete_confirm.html'
199 | success_url = '/dashboard/invest'
200 | success_message = 'Invests Details Deleted'
201 | error_message = 'Invests Details Not Deleted'
202 |
203 | # * earn view
204 | @method_decorator(login_required(login_url='login'), name='dispatch')
205 | class EarnView(View):
206 | def get(self, request,):
207 | earnings = Earning.objects.all()
208 | filters = EarningFilter(request.GET, queryset=earnings)
209 | paginator = Paginator(filters.qs, 25)
210 | page_number = request.GET.get('paginator')
211 | earnings = paginator.get_page(page_number)
212 | context = {
213 | 'earnings':earnings, 'filters':filters
214 | }
215 | return render(request, 'dashboard/earnings/earnings.html', context)
216 |
217 | # earning create view
218 | @method_decorator(login_required(login_url='login'), name='dispatch')
219 | class EarnCreateView(SuccessMessageMixin,CreateView):
220 | form_class = EarningForm
221 | template_name = 'dashboard/earnings/earning_form.html'
222 | success_message = 'Earning Details Created'
223 | error_message = 'Earning Details Not Created'
224 | success_url = '/dashboard/earns'
225 |
226 | # earn update view
227 | @method_decorator(login_required(login_url='login'), name='dispatch')
228 | class EarnUpdateView(SuccessMessageMixin,UpdateView):
229 | model = Earning
230 | form_class = EarningForm
231 | template_name = 'dashboard/earnings/earning_form.html'
232 | success_message = 'Earning Details updated'
233 | error_message = 'Earning Details Not updated'
234 | success_url = '/dashboard/earns'
235 |
236 | # earn delete view
237 | @method_decorator(login_required(login_url='login'), name='dispatch')
238 | class EarnDelete(SuccessMessageMixin,DeleteView):
239 | model = Earning
240 | template_name = 'dashboard/earnings/earn_delete_confirm.html'
241 | success_url = '/dashboard/earns'
242 | success_message = 'Earning Details Deleted'
243 | error_message = 'Earning Details Not Deleted'
244 |
245 | # Commission Update View
246 | @method_decorator(login_required(login_url='login'), name='dispatch')
247 | class CommissionUpdateView(SuccessMessageMixin,UpdateView):
248 | model = Commission
249 | form_class = CommissionForm
250 | template_name = 'dashboard/commission/commission_form.html'
251 | success_url = '/dashboard'
252 | success_message = 'Commission Details Updated'
253 | error_message = 'Commission Details Not Updated'
254 |
255 |
256 | # Company Profile View
257 | @method_decorator(login_required(login_url='login'), name='dispatch')
258 | class CompanyProfileView(SuccessMessageMixin,UpdateView):
259 | model = CompanyProfile
260 | form_class = CompanyProfileForm
261 | template_name = 'dashboard/profile/profile_form.html'
262 | success_url = '/dashboard'
263 | success_message = 'Commission Details Updated'
264 | error_message = 'Commission Details Not Updated'
--------------------------------------------------------------------------------