first commit
This commit is contained in:
commit
b71ea45681
898 changed files with 138202 additions and 0 deletions
0
common/__init__.py
Normal file
0
common/__init__.py
Normal file
3
common/admin.py
Normal file
3
common/admin.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
6
common/apps.py
Normal file
6
common/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CommonConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'common'
|
13
common/consts.py
Normal file
13
common/consts.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from enum import Enum
|
||||
|
||||
|
||||
class UserRoles(Enum):
|
||||
ADMIN = "adm" #ادمین
|
||||
CUSTOMER = "cus" #مشترک
|
||||
MANAGER = "mng" #مدیر
|
||||
ACCOUNTANT = "aco" #حسابدار
|
||||
BROKER = "bro" # کارگزار - پیشخان
|
||||
INSTALLER = "inst" # نصاب
|
||||
REGIONAL_WATER_AUTHORITY = "rwa" # کارشناس امور
|
||||
WATER_RESOURCE_MANAGER = "wrm" # مدیر منابع آب
|
||||
HEADQUARTER = "hdq" # ستاد آب منطقهای
|
9
common/context_processors.py
Normal file
9
common/context_processors.py
Normal file
|
@ -0,0 +1,9 @@
|
|||
from datetime import datetime
|
||||
|
||||
def current_year(request):
|
||||
"""
|
||||
Context processor to add current year to all templates
|
||||
"""
|
||||
return {
|
||||
'current_year': datetime.now().year
|
||||
}
|
67
common/decorators.py
Normal file
67
common/decorators.py
Normal file
|
@ -0,0 +1,67 @@
|
|||
from functools import wraps
|
||||
|
||||
from django.http import JsonResponse, HttpResponse
|
||||
from django.shortcuts import redirect
|
||||
|
||||
from extensions.consts import UserRoles
|
||||
|
||||
|
||||
def require_ajax(view_func):
|
||||
@wraps(view_func)
|
||||
def _wrapped_view(request, *args, **kwargs):
|
||||
if not request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||||
return JsonResponse({'error': 'Only AJAX requests are allowed.'}, status=400)
|
||||
return view_func(request, *args, **kwargs)
|
||||
|
||||
return _wrapped_view
|
||||
|
||||
|
||||
def allowed_roles(allowed_roles: list[UserRoles]):
|
||||
"""
|
||||
@param allowed_roles must not be empty
|
||||
"""
|
||||
|
||||
def decorator(views_func):
|
||||
def wrapper_func(request, *args, **kwargs):
|
||||
roles = [role.slug for role in request.user.profile.roles.all()]
|
||||
allowed_role_names = [role.value for role in allowed_roles]
|
||||
if any(item in roles for item in allowed_role_names):
|
||||
return views_func(request, *args, **kwargs)
|
||||
else:
|
||||
return HttpResponse('you are not allow', status=401)
|
||||
|
||||
return wrapper_func
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
def profile_complete_needed(view_func):
|
||||
@wraps(view_func)
|
||||
def _wrapped_view(request, *args, **kwargs):
|
||||
if not request.user.profile or not request.user.profile.is_completed:
|
||||
return redirect("accounts:profile")
|
||||
return view_func(request, *args, **kwargs)
|
||||
|
||||
return _wrapped_view
|
||||
|
||||
|
||||
def superuser_required(views_func):
|
||||
def wrapper_func(request, *args, **kwargs):
|
||||
user = request.user
|
||||
if user.is_superuser:
|
||||
return views_func(request, *args, **kwargs)
|
||||
else:
|
||||
return redirect('dashboard:vodDashboard')
|
||||
|
||||
return wrapper_func
|
||||
|
||||
|
||||
def staffuser_required(views_func):
|
||||
def wrapper_func(request, *args, **kwargs):
|
||||
user = request.user
|
||||
if user.is_staff:
|
||||
return views_func(request, *args, **kwargs)
|
||||
else:
|
||||
return redirect('dashboard:vodDashboard')
|
||||
|
||||
return wrapper_func
|
0
common/migrations/__init__.py
Normal file
0
common/migrations/__init__.py
Normal file
128
common/models.py
Normal file
128
common/models.py
Normal file
|
@ -0,0 +1,128 @@
|
|||
from django.contrib import admin
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from _helpers.utils import jalali_converter, generate_unique_slug
|
||||
|
||||
|
||||
class ObjectsQuerySet(models.QuerySet):
|
||||
def deleted_objects(self):
|
||||
return self.filter(is_deleted=True)
|
||||
|
||||
def available_objects(self):
|
||||
return self.filter(is_deleted=False)
|
||||
|
||||
def active_objects(self):
|
||||
return self.filter(is_active=True)
|
||||
|
||||
def inactive_objects(self):
|
||||
return self.filter(is_active=False)
|
||||
|
||||
|
||||
class BaseModel(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ ایجاد")
|
||||
updated = models.DateTimeField(auto_now=True, verbose_name="تاریخ بروزرسانی")
|
||||
is_active = models.BooleanField(default=True, verbose_name="فعال")
|
||||
is_deleted = models.BooleanField(default=False, verbose_name="حذف شده")
|
||||
deleted_at = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ حذف")
|
||||
|
||||
objects = ObjectsQuerySet.as_manager()
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.is_deleted:
|
||||
self.is_active = False
|
||||
super(BaseModel, self).save(*args, **kwargs)
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
self.is_deleted = True
|
||||
self.deleted_at = timezone.now()
|
||||
self.save()
|
||||
|
||||
def hard_delete(self):
|
||||
super().delete()
|
||||
|
||||
def jcreated(self):
|
||||
return jalali_converter(self.created)
|
||||
|
||||
jcreated.short_description = "تاریخ ایجاد"
|
||||
|
||||
def jcreated_date(self):
|
||||
return self.jcreated().split(',')[0]
|
||||
|
||||
jcreated_date.short_description = "تاریخ ایجاد"
|
||||
|
||||
def jupdated(self):
|
||||
return jalali_converter(self.updated)
|
||||
|
||||
jupdated.short_description = "تاریخ بروزرسانی"
|
||||
|
||||
def jupdated_date(self):
|
||||
return self.jupdated().split(',')[0]
|
||||
|
||||
jupdated_date.short_description = "تاریخ بروزرسانی"
|
||||
|
||||
|
||||
class SluggedModel(BaseModel):
|
||||
slug = models.SlugField(max_length=100, unique=True, verbose_name="اسلاگ")
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if not self.slug:
|
||||
if hasattr(self, 'name'):
|
||||
self.slug = generate_unique_slug(self.name)
|
||||
else:
|
||||
self.slug = generate_unique_slug(str(self.created))
|
||||
super(BaseModel, self).save(*args, **kwargs)
|
||||
|
||||
|
||||
class SelfParentModel(BaseModel):
|
||||
parent = models.ForeignKey('self', related_name='children',
|
||||
on_delete=models.SET_NULL, null=True, blank=True, default=None,
|
||||
verbose_name='زیرشاخه')
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
||||
class NameSlugModel(SluggedModel):
|
||||
name = models.CharField(max_length=100, verbose_name="نام")
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class NameSlugAdminModel(admin.ModelAdmin):
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
||||
class SelfParentNameSlugModel(SelfParentModel, NameSlugModel):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
||||
class TagModel(SelfParentModel, NameSlugModel):
|
||||
class Meta:
|
||||
abstract = True
|
||||
ordering = ['parent__id', 'name']
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class TagAdminModel(admin.ModelAdmin):
|
||||
fields = ['name', 'slug', 'parent', 'is_active']
|
||||
list_display = ['name', 'slug', 'parent', 'is_active', 'is_deleted', 'jcreated']
|
||||
list_filter = ['is_active', 'slug', 'parent', 'is_deleted']
|
||||
search_fields = ['name', 'slug', 'parent__name']
|
||||
prepopulated_fields = {'slug': ('name',)}
|
3
common/tests.py
Normal file
3
common/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
3
common/views.py
Normal file
3
common/views.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
Loading…
Add table
Add a link
Reference in a new issue