├── 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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
7 | {% csrf_token %} 8 | {{ form|crispy }} 9 | 10 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
9 | {% csrf_token %} 10 | {{ form|crispy }} 11 | 12 |
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 |
9 | {% csrf_token %} 10 | {{ form|crispy }} 11 | 12 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object.brand }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object.name }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object.name }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object.Brand }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 |
6 | {% csrf_token %} 7 |

Are you sure you want to delete "{{ object }}"?

8 | {{ form }} 9 | 10 | Cancel 11 |
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 | 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 | avatar 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 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | {% for user in users %} 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {% endfor %} 34 | 35 | 36 |
10 | Create 11 | User's Details
#first namelast nameemailupdatedelete
{{forloop.counter}}{{user.first_name}}{{user.last_name}}{{user.email}}updatedelete
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 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | {% for package in packages %} 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | {% endfor %} 36 | 37 | 38 |
13 | Create 14 |
#namespeedpriceupdatedelete
{{forloop.counter}}{{package.name}}{{package.speed}}{{package.price}}updatedelete
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 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% for category in taskCategory %} 22 | 23 | 24 | 25 | 26 | 27 | 28 | {% endfor %} 29 | 30 | 31 |
10 | Create 11 |
#nameupdatedelete
{{forloop.counter}}{{category.name}}updatedelete
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 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% for employ_category in categories %} 21 | 22 | 23 | 24 | 25 | 26 | 27 | {% endfor %} 28 | 29 | 30 |
9 | Create 10 |
#nameupdatedelete
{{forloop.counter}}{{employ_category.name}}updatedelete
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 | 12 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {% for category in categories %} 29 | 30 | 31 | 32 | 33 | 34 | {% endfor %} 35 | 36 | 37 |
10 | Create 11 |
14 | {{ filters.form.name.label_tag }} 15 | {{ filters.form.name }} 16 | 17 |
#nameupdatedelete
{{forloop.counter}}{{category.name}}updatedelete
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 | 12 | 13 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {% for owner in owners %} 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | {% endfor %} 40 | 41 | 42 |
10 | Create 11 |
14 | {{ filters.form.name.label_tag }} 15 | {{ filters.form.name }} 16 | 18 | 19 |
#namecommissionupdatedelete
{{forloop.counter}}{{owner.name}}{{owner.Commission}}updatedelete
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 | 15 | 16 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {% for pop in pops %} 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | {% endfor %} 47 | 48 | 49 |
13 | Create 14 |
17 | {{ filters.form.name.label_tag }} 18 | {{ filters.form.name }} 19 | 21 | 22 |
#namemain poppon powerpop userupdatedelete
{{forloop.counter}}{{pop.name}}{{pop.main_pop}}{{pop.input_power}}{{pop.total_user}}updatedelete
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 | 12 | 13 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {% for invest in invests %} 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {% endfor %} 42 | 43 | 44 |
10 | Create 11 |
14 | {{ filters.form.created_at.label_tag }} 15 | {{ filters.form.created_at }} 16 | 17 |
#invest detailsinvest amountcreated atupdated atupdatedelete
{{forloop.counter}}{{invest.invest_details}}{{invest.invest_amount}}{{invest.created_at}}{{invest.updated_at}}updatedelete
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 | 12 | 13 | 17 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {% for earn in earnings %} 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | {% endfor %} 44 | 45 | 46 |
10 | Create 11 |
14 | {{ filters.form.created_at.label_tag }} 15 | {{ filters.form.created_at }} 16 | 18 | 19 |
#earn detailsearn amountcreated atupdated atupdatedelete
{{forloop.counter}}{{earn.earning_details}}{{earn.earning_amount}}{{earn.created_at}}{{earn.updated_at}}updatedelete
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 | 11 | 12 | 16 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {% for employ in employs %} 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | {% endfor %} 47 | 48 | 49 |
9 | Create 10 |
13 | {{ filters.form.phone.label_tag }} 14 | {{ filters.form.phone }} 15 | 17 | {{ filters.form.name.label_tag }} 18 | {{ filters.form.name }} 19 | 21 | 22 |
#namephoneaddressstatusupdatedelete
{{forloop.counter}}{{employ.name}}{{employ.phone}}{{employ.address}}{{employ.status}}updatedelete
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 |
10 |
11 | 25 |
26 | 27 |
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 | 15 | 16 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | {% for task in tasks %} 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {% endfor %} 57 | 58 | 59 |
13 | Create 14 |
17 | {{ filters.form.task_token.label_tag }} 18 | {{ filters.form.task_token }} 19 | 21 | 22 |
#task_tokencreatorsolvertitlestatusapprovedcreated atupdated atupdatedelete
{{forloop.counter}}{{task.task_token}}{{task.creator}}{{task.solver}}{{task.title}}{{task.status}}{{task.approved}}{{task.created}}{{task.updated}}updatedelete
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 | 15 | 16 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | {% for onu in onus %} 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | {% endfor %} 59 | 60 | 61 |
13 | Create 14 |
17 | {{ filters.form.mac.label_tag }} 18 | {{ filters.form.mac }} 19 | 21 | {{ filters.form.status.label_tag }} 22 | {{ filters.form.status }} 23 | 25 | 26 |
#brandmodelmacportstatuscreatedupdatedupdatedelete
{{forloop.counter}}{{onu.brand}}{{onu.model}}{{onu.mac}}{{onu.port}}{{onu.status}}{{onu.created}}{{onu.updated}}updatedelete
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 | 14 | 15 | 19 | 23 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | {% for product in products %} 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {% endfor %} 57 | 58 | 59 |
12 | Create 13 |
16 | {{ filters.form.serial.label_tag }} 17 | {{ filters.form.serial }} 18 | 20 | {{ filters.form.category.label_tag }} 21 | {{ filters.form.category }} 22 | 24 | {{ filters.form.status.label_tag }} 25 | {{ filters.form.status }} 26 | 27 |
#brandmodelserialcategorystatuscreatedupdatedupdatedelete
{{forloop.counter}}{{product.Brand}}{{product.model}}{{product.serial}}{{product.category}}{{product.status}}{{product.created}}{{product.updated}}updatedelete
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 | 15 | 16 | 20 | 24 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | {% for client in clients %} 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {% endfor %} 57 | 58 | 59 |
13 | Create 14 |
17 | {{ filters.form.phone.label_tag }} 18 | {{ filters.form.phone }} 19 | 21 | {{ filters.form.ip.label_tag }} 22 | {{ filters.form.ip }} 23 | 25 | 26 |
#namephonesubscriber idip/Usernamecreated atupdated atupdatedelete
{{forloop.counter}}{{client.name}}{{client.phone}}{{client.client_id}}{{client.ip}}{{client.created}}{{client.updated}}updatedelete
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 | 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' --------------------------------------------------------------------------------