Solving the user creation issues and to dashboard navbar to be as role based

This commit is contained in:
Vivek P Prakash
2025-11-28 20:22:14 +05:30
parent f092dd80c4
commit 392f86cfaf
3 changed files with 253 additions and 120 deletions

240
.idea/workspace.xml generated
View File

@@ -2,9 +2,9 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="a0020f0b-7bf3-4cde-a27d-39657ebd0286" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/.idea/dataSources.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/accounts/forms.py" beforeDir="false" afterPath="$PROJECT_DIR$/accounts/forms.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/base.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/base.html" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -31,8 +31,8 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="113">
<caret line="33" selection-start-line="33" selection-end-line="37" selection-end-column="52" />
<state relative-caret-position="53">
<caret line="53" column="4" selection-start-line="53" selection-start-column="4" selection-end-line="53" selection-end-column="4" />
<folding>
<element signature="e#0#35#0" expanded="true" />
</folding>
@@ -40,11 +40,44 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-500">
<caret line="11" column="32" lean-forward="true" selection-start-line="11" selection-start-column="32" selection-end-line="11" selection-end-column="32" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="100">
<caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
<caret line="5" column="8" selection-start-line="5" selection-start-column="4" selection-end-line="5" selection-end-column="8" />
<folding>
<element signature="e#0#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/accounts/user_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="12" column="51" lean-forward="true" selection-start-line="12" selection-start-column="51" selection-end-line="12" selection-end-column="51" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/accounts/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="780">
<caret line="54" lean-forward="true" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
@@ -62,7 +95,7 @@
<entry file="file://$PROJECT_DIR$/accounts/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="140">
<caret line="7" column="37" lean-forward="true" selection-start-line="7" selection-start-column="37" selection-end-line="7" selection-end-column="37" />
<caret line="7" column="36" lean-forward="true" selection-start-line="7" selection-start-column="36" selection-end-line="7" selection-end-column="36" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
@@ -70,11 +103,23 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/eventify/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="11" column="12" selection-start-line="11" selection-start-column="12" selection-end-line="11" selection-end-column="12" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/eventify/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="260">
<caret line="16" column="44" lean-forward="true" selection-start-line="16" selection-start-column="44" selection-end-line="16" selection-end-column="44" />
<state relative-caret-position="160">
<caret line="11" column="19" lean-forward="true" selection-start-line="11" selection-start-column="19" selection-end-line="11" selection-end-column="19" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
@@ -82,11 +127,11 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="28" column="19" lean-forward="true" selection-start-line="28" selection-start-column="19" selection-end-line="28" selection-end-column="19" />
<state relative-caret-position="-155">
<caret line="35" column="27" lean-forward="true" selection-start-line="35" selection-start-column="27" selection-end-line="35" selection-end-column="27" />
</state>
</provider>
</entry>
@@ -101,6 +146,11 @@
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>User</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
@@ -112,7 +162,6 @@
<option value="$PROJECT_DIR$/templates/events/event_form.html" />
<option value="$PROJECT_DIR$/master_data/forms.py" />
<option value="$PROJECT_DIR$/templates/master_data/event_type_form.html" />
<option value="$PROJECT_DIR$/templates/accounts/user_form.html" />
<option value="$PROJECT_DIR$/templates/events/event_images_form.html" />
<option value="$PROJECT_DIR$/templates/events/event_images_list.html" />
<option value="$PROJECT_DIR$/events/urls.py" />
@@ -124,7 +173,9 @@
<option value="$PROJECT_DIR$/eventify/urls.py" />
<option value="$PROJECT_DIR$/eventify/settings.py" />
<option value="$PROJECT_DIR$/accounts/views.py" />
<option value="$PROJECT_DIR$/templates/accounts/user_form.html" />
<option value="$PROJECT_DIR$/accounts/forms.py" />
<option value="$PROJECT_DIR$/templates/base.html" />
</list>
</option>
</component>
@@ -151,12 +202,12 @@
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="accounts" type="462c0819:PsiDirectoryNode" />
<item name="eventify" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="templatetags" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
@@ -220,7 +271,7 @@
<option name="presentableId" value="Default" />
<updated>1764194364815</updated>
<workItem from="1764194366807" duration="12589000" />
<workItem from="1764319665186" duration="4489000" />
<workItem from="1764319665186" duration="6656000" />
</task>
<task id="LOCAL-00001" summary="Changes in the settings for the deployment">
<created>1764280838609</created>
@@ -236,17 +287,23 @@
<option name="project" value="LOCAL" />
<updated>1764326487986</updated>
</task>
<option name="localTasksCounter" value="3" />
<task id="LOCAL-00003" summary="Changes">
<created>1764336333100</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1764336333100</updated>
</task>
<option name="localTasksCounter" value="4" />
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="17078000" />
<option name="totallyTimeSpent" value="19245000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
<editor active="true" />
<layout>
<window_info active="true" content_ui="combo" id="Project" order="0" visible="true" weight="0.25416037" />
<window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.25416037" />
<window_info id="Structure" order="1" side_tool="true" weight="0.25" />
<window_info id="Favorites" order="2" side_tool="true" />
<window_info anchor="bottom" id="Message" order="0" />
@@ -260,7 +317,7 @@
<window_info anchor="bottom" id="Version Control" order="8" />
<window_info anchor="bottom" id="Database Changes" order="9" />
<window_info anchor="bottom" id="Event Log" order="10" side_tool="true" />
<window_info anchor="bottom" id="Terminal" order="11" visible="true" weight="0.354201" />
<window_info active="true" anchor="bottom" id="Terminal" order="11" visible="true" weight="0.354201" />
<window_info anchor="bottom" id="Python Console" order="12" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
@@ -275,7 +332,8 @@
<component name="VcsManagerConfiguration">
<MESSAGE value="Changes in the settings for the deployment" />
<MESSAGE value="Edit in the login view for the redirection for the already login user" />
<option name="LAST_COMMIT_MESSAGE" value="Edit in the login view for the redirection for the already login user" />
<MESSAGE value="Changes" />
<option name="LAST_COMMIT_MESSAGE" value="Changes" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/.env.example">
@@ -380,13 +438,6 @@
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/contrib/auth/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-67">
<caret line="93" column="6" selection-start-line="93" selection-start-column="6" selection-end-line="93" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/master_data/event_type_form.html">
<provider selected="true" editor-type-id="text-editor">
<state>
@@ -394,13 +445,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/user_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="9" column="34" lean-forward="true" selection-end-line="23" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
@@ -491,6 +535,74 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/user_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="4" column="57" selection-start-line="4" selection-start-column="57" selection-end-line="4" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/user_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="12" column="51" lean-forward="true" selection-start-line="12" selection-start-column="51" selection-end-line="12" selection-end-column="51" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="780">
<caret line="54" lean-forward="true" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/contrib/auth/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-659">
<caret line="208" column="6" selection-start-line="208" selection-start-column="6" selection-end-line="208" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/forms/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="113">
<caret line="332" column="6" selection-start-line="332" selection-start-column="6" selection-end-line="332" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="140">
<caret line="7" column="36" lean-forward="true" selection-start-line="7" selection-start-column="36" selection-end-line="7" selection-end-column="36" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="100">
<caret line="5" column="8" selection-start-line="5" selection-start-column="4" selection-end-line="5" selection-end-column="8" />
<folding>
<element signature="e#0#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-500">
<caret line="11" column="32" lean-forward="true" selection-start-line="11" selection-start-column="32" selection-end-line="11" selection-end-column="32" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/eventify/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
@@ -501,74 +613,30 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="300">
<caret line="54" lean-forward="true" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitignore">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/eventify/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="260">
<caret line="16" column="44" lean-forward="true" selection-start-line="16" selection-start-column="44" selection-end-line="16" selection-end-column="44" />
<state relative-caret-position="160">
<caret line="11" column="19" lean-forward="true" selection-start-line="11" selection-start-column="19" selection-end-line="11" selection-end-column="19" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="28" column="19" lean-forward="true" selection-start-line="28" selection-start-column="19" selection-end-line="28" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/user_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="4" column="57" selection-start-line="4" selection-start-column="57" selection-end-line="4" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="113">
<caret line="33" selection-start-line="33" selection-end-line="37" selection-end-column="52" />
<state relative-caret-position="53">
<caret line="53" column="4" selection-start-line="53" selection-start-column="4" selection-end-line="53" selection-end-column="4" />
<folding>
<element signature="e#0#35#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/urls.py">
<entry file="file://$PROJECT_DIR$/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="140">
<caret line="7" column="37" lean-forward="true" selection-start-line="7" selection-start-column="37" selection-end-line="7" selection-end-column="37" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="20">
<caret line="1" column="28" lean-forward="true" selection-start-line="1" selection-start-column="28" selection-end-line="1" selection-end-column="28" />
<folding>
<element signature="e#0#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="100">
<caret line="5" lean-forward="true" selection-start-line="5" selection-end-line="5" />
<state relative-caret-position="-155">
<caret line="35" column="27" lean-forward="true" selection-start-line="35" selection-start-column="27" selection-end-line="35" selection-end-column="27" />
</state>
</provider>
</entry>

View File

@@ -10,22 +10,64 @@ User = get_user_model()
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
password = forms.CharField(
widget=forms.PasswordInput,
label="Password"
)
confirm_password = forms.CharField(
widget=forms.PasswordInput,
label="Confirm Password"
)
phone_number = forms.CharField(
max_length=15,
required=True,
label="Phone Number"
)
ROLE_CHOICES = [
('admin', 'Admin'),
('manager', 'Manager'),
('staff', 'Staff'),
]
role = forms.ChoiceField(
choices=ROLE_CHOICES,
required=True,
label="Role"
)
class Meta:
model = User
fields = ["username", "email", "password"]
fields = ["username", "email", "phone_number", "role", "password", "confirm_password"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs.update({"class": "form-control"})
def form_valid(self, form):
user = form.save(commit=False)
user.set_password(form.cleaned_data['password'])
def clean(self):
cleaned_data = super().clean()
password = cleaned_data.get("password")
confirm_password = cleaned_data.get("confirm_password")
if password and confirm_password and password != confirm_password:
self.add_error("confirm_password", "Passwords do not match!")
return cleaned_data
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data['password']) # Hash the password
# Save phone_number and role to the User model (if your User model has these fields)
user.phone_number = self.cleaned_data.get("phone_number")
user.role = self.cleaned_data.get("role")
if commit:
user.save()
return super().form_valid(form)
return user
class LoginForm(AuthenticationForm):

View File

@@ -15,10 +15,33 @@
</button>
<div class="collapse navbar-collapse" id="navmenu">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link" href="{% url 'dashboard' %}">Dashboard</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'master_data:event_type_list' %}">Categories</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'events:event_list' %}">Events</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'accounts:user_list' %}">Users</a></li>
<!-- Accessible by Admin, Manager, Staff -->
<li class="nav-item">
<a class="nav-link" href="{% url 'dashboard' %}">Dashboard</a>
</li>
{% if user.role == "admin" or user.role == "manager" %}
<!-- Admin + Manager -->
<li class="nav-item">
<a class="nav-link" href="{% url 'master_data:event_type_list' %}">Categories</a>
</li>
{% endif %}
{% if user.role in "admin manager staff" %}
<!-- Admin + Manager + Staff -->
<li class="nav-item">
<a class="nav-link" href="{% url 'events:event_list' %}">Events</a>
</li>
{% endif %}
{% if user.role == "admin" %}
<!-- Admin only -->
<li class="nav-item">
<a class="nav-link" href="{% url 'accounts:user_list' %}">Users</a>
</li>
{% endif %}
</ul>
<ul class="navbar-nav">
{% if user.is_authenticated %}