Skip to content

Commit 2f85633

Browse files
committed
Initial commit
1 parent 9805478 commit 2f85633

File tree

929 files changed

+515
-147
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

929 files changed

+515
-147
lines changed
0 Bytes
Binary file not shown.
4.33 KB
Binary file not shown.
0 Bytes
Binary file not shown.
1.66 KB
Binary file not shown.
1.68 KB
Binary file not shown.

adminops/admin.py

+85-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,88 @@
1-
#from django.contrib import admin
1+
from hawwa.models import CustomUser
2+
from adminops.forms import UserCreationForm
3+
from adminops.models import Department, UserProfile, Expense, Revenue, Report
24
from django.contrib import admin
3-
from .models import Department, UserProfile
5+
from django.contrib.auth.admin import UserAdmin
6+
from django.contrib.auth.models import Group
47

8+
# Register Department model
59
admin.site.register(Department)
6-
admin.site.register(UserProfile)
7-
# Register your models here.
10+
11+
# Register Expense model
12+
@admin.register(Expense)
13+
class ExpenseAdmin(admin.ModelAdmin):
14+
list_display = ('category', 'amount', 'date')
15+
search_fields = ('category', 'description')
16+
17+
# Register Revenue model
18+
@admin.register(Revenue)
19+
class RevenueAdmin(admin.ModelAdmin):
20+
list_display = ('source', 'amount', 'date')
21+
search_fields = ('source', 'description')
22+
23+
# Register Report model
24+
@admin.register(Report)
25+
class ReportAdmin(admin.ModelAdmin):
26+
list_display = ('title', 'generated_on')
27+
search_fields = ('title',)
28+
29+
# Register UserProfile model
30+
@admin.register(UserProfile)
31+
class UserProfileAdmin(admin.ModelAdmin):
32+
list_display = ('user', 'get_department') # Display username and department
33+
search_fields = ('user__username', 'user__department__name') # Search user details
34+
ordering = ('user__username',)
35+
actions = ['set_rbac_permissions', 'create_user'] # Add create_user action
36+
37+
# Method to retrieve the department from CustomUser
38+
def get_department(self, obj):
39+
return obj.user.department
40+
get_department.short_description = 'Department'
41+
42+
# Action to manage RBAC permissions
43+
def set_rbac_permissions(self, request, queryset):
44+
for userprofile in queryset:
45+
try:
46+
group = Group.objects.get(name="View Group")
47+
userprofile.user.user_permissions.add(*group.permissions.all())
48+
except Group.DoesNotExist:
49+
self.message_user(request, "View Group does not exist. Please create it first.", level="error")
50+
self.message_user(request, "RBAC permissions updated successfully!")
51+
52+
# Custom action to create a new user
53+
def create_user(self, request, queryset):
54+
from django.shortcuts import render
55+
from django.http import HttpResponseRedirect
56+
from django.urls import reverse
57+
from adminops.forms import UserCreationForm
58+
59+
if request.method == 'POST':
60+
form = UserCreationForm(request.POST)
61+
if form.is_valid():
62+
new_user = form.save()
63+
self.message_user(request, f"User '{new_user.username}' created successfully.")
64+
return HttpResponseRedirect(reverse('admin:adminops_userprofile_changelist'))
65+
else:
66+
form = UserCreationForm()
67+
68+
return render(request, 'admin/create_user.html', {'form': form})
69+
create_user.short_description = 'Create a new user'
70+
71+
# Register CustomUser model
72+
@admin.register(CustomUser)
73+
class CustomUserAdmin(UserAdmin):
74+
fieldsets = (
75+
(None, {'fields': ('username', 'password')}),
76+
('Personal Info', {'fields': ('first_name', 'last_name', 'email', 'department')}),
77+
('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
78+
('Important Dates', {'fields': ('last_login', 'date_joined')}),
79+
)
80+
add_fieldsets = (
81+
(None, {
82+
'classes': ('wide',),
83+
'fields': ('username', 'password1', 'password2', 'email', 'department'),
84+
}),
85+
)
86+
list_display = ('username', 'email', 'first_name', 'last_name', 'department', 'is_staff')
87+
search_fields = ('username', 'email', 'first_name', 'last_name')
88+
ordering = ('username',)

adminops/forms.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from django import forms
2+
from django.contrib.auth.models import Group
3+
from hawwa.models import CustomUser
4+
from adminops.models import Department
5+
6+
class UserCreationForm(forms.ModelForm):
7+
password = forms.CharField(widget=forms.PasswordInput)
8+
department = forms.ModelChoiceField(queryset=Department.objects.all())
9+
rbac_group = forms.ModelChoiceField(queryset=Group.objects.all(), required=False)
10+
11+
class Meta:
12+
model = CustomUser
13+
fields = ['username', 'password', 'email', 'first_name', 'last_name', 'department']
14+
15+
def save(self, commit=True):
16+
user = super().save(commit=False)
17+
user.set_password(self.cleaned_data['password'])
18+
if commit:
19+
user.save()
20+
return user

adminops/migrations/0001_initial.py

+31-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.1.6 on 2025-02-26 06:24
1+
# Generated by Django 5.1.7 on 2025-03-20 04:26
22

33
import django.db.models.deletion
44
from django.conf import settings
@@ -22,13 +22,40 @@ class Migration(migrations.Migration):
2222
('description', models.TextField(blank=True)),
2323
],
2424
),
25+
migrations.CreateModel(
26+
name='Expense',
27+
fields=[
28+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
29+
('category', models.CharField(max_length=100)),
30+
('amount', models.DecimalField(decimal_places=2, max_digits=10)),
31+
('date', models.DateField()),
32+
('description', models.TextField(blank=True, null=True)),
33+
],
34+
),
35+
migrations.CreateModel(
36+
name='Report',
37+
fields=[
38+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
39+
('title', models.CharField(max_length=200)),
40+
('content', models.TextField()),
41+
('generated_on', models.DateField(auto_now_add=True)),
42+
],
43+
),
44+
migrations.CreateModel(
45+
name='Revenue',
46+
fields=[
47+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
48+
('source', models.CharField(max_length=100)),
49+
('amount', models.DecimalField(decimal_places=2, max_digits=10)),
50+
('date', models.DateField()),
51+
('description', models.TextField(blank=True, null=True)),
52+
],
53+
),
2554
migrations.CreateModel(
2655
name='UserProfile',
2756
fields=[
2857
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
29-
('role', models.CharField(max_length=50)),
30-
('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='adminops.department')),
31-
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
58+
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='adminops_userprofile', to=settings.AUTH_USER_MODEL)),
3259
],
3360
),
3461
]
Binary file not shown.
Binary file not shown.
Binary file not shown.

adminops/models.py

+29-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.conf import settings
12
from django.db import models
23
from django.contrib.auth.models import User
34

@@ -9,11 +10,34 @@ def __str__(self):
910
return self.name
1011

1112
class UserProfile(models.Model):
12-
user = models.OneToOneField(User, on_delete=models.CASCADE)
13-
department = models.ForeignKey(Department, on_delete=models.CASCADE)
14-
role = models.CharField(max_length=50)
13+
user = models.OneToOneField(
14+
settings.AUTH_USER_MODEL,
15+
on_delete=models.CASCADE,
16+
related_name="adminops_userprofile" # Unique related_name
17+
)
18+
19+
class Expense(models.Model):
20+
category = models.CharField(max_length=100)
21+
amount = models.DecimalField(max_digits=10, decimal_places=2)
22+
date = models.DateField()
23+
description = models.TextField(blank=True, null=True)
24+
25+
def __str__(self):
26+
return f"{self.category} - {self.amount}"
27+
28+
class Revenue(models.Model):
29+
source = models.CharField(max_length=100)
30+
amount = models.DecimalField(max_digits=10, decimal_places=2)
31+
date = models.DateField()
32+
description = models.TextField(blank=True, null=True)
1533

1634
def __str__(self):
17-
return self.user.username
35+
return f"{self.source} - {self.amount}"
36+
37+
class Report(models.Model):
38+
title = models.CharField(max_length=200)
39+
content = models.TextField()
40+
generated_on = models.DateField(auto_now_add=True)
1841

19-
# Create your models here.
42+
def __str__(self):
43+
return self.title

backup.sql

Whitespace-only changes.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.
0 Bytes
Binary file not shown.
130 Bytes
Binary file not shown.
549 Bytes
Binary file not shown.
0 Bytes
Binary file not shown.
1.49 KB
Binary file not shown.
-25 Bytes
Binary file not shown.
-722 Bytes
Binary file not shown.
-2.87 KB
Binary file not shown.

hawwa/admin.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#from django.contrib import admin
2+
#from django.contrib.auth.admin import UserAdmin
3+
#from .models import CustomUser
4+

hawwa/custom_admin.py

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.contrib.admin import AdminSite
2+
3+
class HawwaAdminSite(AdminSite):
4+
site_header = "Hawwa Wellness Admin Panel"
5+
site_title = "Hawwa Wellness Portal"
6+
index_title = "Rediscover your strength, wellness, and joy with Hawwa."

hawwa/migrations/0001_initial.py

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
# Generated by Django 5.1.7 on 2025-03-19 10:00
2+
3+
import django.contrib.auth.models
4+
import django.contrib.auth.validators
5+
import django.db.models.deletion
6+
import django.utils.timezone
7+
from django.conf import settings
8+
from django.db import migrations, models
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
initial = True
14+
15+
dependencies = [
16+
('auth', '0012_alter_user_first_name_max_length'),
17+
]
18+
19+
operations = [
20+
migrations.CreateModel(
21+
name='CustomUser',
22+
fields=[
23+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
24+
('password', models.CharField(max_length=128, verbose_name='password')),
25+
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
26+
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
27+
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
28+
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
29+
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
30+
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
31+
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
32+
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
33+
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
34+
('is_verified', models.BooleanField(default=False)),
35+
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
36+
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
37+
],
38+
options={
39+
'verbose_name': 'user',
40+
'verbose_name_plural': 'users',
41+
'abstract': False,
42+
},
43+
managers=[
44+
('objects', django.contrib.auth.models.UserManager()),
45+
],
46+
),
47+
migrations.CreateModel(
48+
name='EmailOTP',
49+
fields=[
50+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
51+
('otp', models.CharField(max_length=6)),
52+
('created_at', models.DateTimeField(auto_now_add=True)),
53+
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
54+
],
55+
),
56+
migrations.CreateModel(
57+
name='UserProfile',
58+
fields=[
59+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
60+
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='hawwa_userprofile', to=settings.AUTH_USER_MODEL)),
61+
],
62+
),
63+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Generated by Django 5.1.7 on 2025-03-20 05:11
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('adminops', '0001_initial'),
11+
('hawwa', '0001_initial'),
12+
]
13+
14+
operations = [
15+
migrations.RemoveField(
16+
model_name='customuser',
17+
name='is_verified',
18+
),
19+
migrations.AddField(
20+
model_name='customuser',
21+
name='department',
22+
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='adminops.department'),
23+
),
24+
migrations.AddField(
25+
model_name='customuser',
26+
name='department',
27+
field=models.ForeignKey(
28+
to='adminops.Department',
29+
on_delete=django.db.models.deletion.SET_NULL,
30+
null=True,
31+
blank=True
32+
),
33+
),
34+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.7 on 2025-03-20 07:31
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('hawwa', '0002_remove_customuser_is_verified_customuser_department'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='customuser',
15+
name='is_verified',
16+
field=models.BooleanField(default=False),
17+
),
18+
]

hawwa/migrations/__init__.py

Whitespace-only changes.
Binary file not shown.
Binary file not shown.
Binary file not shown.

hawwa/models.py

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,40 @@
11
from django.db import models
2-
from django.contrib.auth.models import User
2+
from django.contrib.auth.models import AbstractUser
3+
from django.conf import settings
34

5+
# UserProfile model
6+
class UserProfile(models.Model):
7+
user = models.OneToOneField(
8+
settings.AUTH_USER_MODEL,
9+
on_delete=models.CASCADE,
10+
related_name="hawwa_userprofile" # Ensures a unique related_name
11+
)
12+
13+
def __str__(self):
14+
return f"UserProfile for {self.user.username}"
15+
16+
# CustomUser model
17+
class CustomUser(AbstractUser):
18+
# Additional fields
19+
department = models.ForeignKey(
20+
'adminops.Department', # Reference to the Department model
21+
on_delete=models.SET_NULL, # Allow null if the department is deleted
22+
null=True,
23+
blank=True
24+
)
25+
is_verified = models.BooleanField(default=False) # Add the missing field
26+
27+
def __str__(self):
28+
return self.username
29+
30+
# EmailOTP model
431
class EmailOTP(models.Model):
5-
user = models.OneToOneField(User, on_delete=models.CASCADE)
6-
otp = models.CharField(max_length=6)
32+
user = models.OneToOneField(
33+
settings.AUTH_USER_MODEL, # Use the custom user model
34+
on_delete=models.CASCADE
35+
)
36+
otp = models.CharField(max_length=6) # OTP code
737
created_at = models.DateTimeField(auto_now_add=True)
38+
39+
def __str__(self):
40+
return f"OTP for {self.user.username} created at {self.created_at}"

0 commit comments

Comments
 (0)