Updates for the event images

This commit is contained in:
Vivek P Prakash
2025-12-01 04:52:49 +05:30
parent 392f86cfaf
commit d96ba46506
24 changed files with 905 additions and 257 deletions

591
.idea/workspace.xml generated
View File

@@ -2,9 +2,20 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="a0020f0b-7bf3-4cde-a27d-39657ebd0286" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/accounts/manager.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/forms/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/forms/event_forms.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/forms/user_forms.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/urls.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/views/__init__.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/mobile_web_api/views/events.py" 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" />
<change beforePath="$PROJECT_DIR$/accounts/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/accounts/models.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/eventify/settings.py" beforeDir="false" afterPath="$PROJECT_DIR$/eventify/settings.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/eventify/urls.py" beforeDir="false" afterPath="$PROJECT_DIR$/eventify/urls.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/events/forms.py" beforeDir="false" afterPath="$PROJECT_DIR$/events/forms.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/events/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/events/models.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/templates/events/event_list.html" beforeDir="false" afterPath="$PROJECT_DIR$/templates/events/event_list.html" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@@ -29,22 +40,64 @@
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/views.py">
<entry file="file://$PROJECT_DIR$/templates/events/event_list.html">
<provider selected="true" editor-type-id="text-editor">
<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" />
<state relative-caret-position="240">
<caret line="33" column="21" selection-start-line="33" selection-start-column="21" selection-end-line="33" selection-end-column="21" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/eventify/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="20">
<caret line="7" column="32" selection-start-line="7" selection-start-column="32" selection-end-line="7" selection-end-column="32" />
<folding>
<element signature="e#0#35#0" expanded="true" />
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/forms.py">
<entry file="file://$PROJECT_DIR$/events/views.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" />
<state relative-caret-position="173">
<caret line="68" column="44" selection-start-line="68" selection-start-column="44" selection-end-line="68" selection-end-column="44" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/events/event_images_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="10" selection-start-line="10" selection-end-line="10" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/events/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="245">
<caret line="50" selection-start-line="50" selection-end-line="50" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/events/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-179">
<caret line="38" column="6" selection-start-line="38" selection-start-column="6" selection-end-line="38" selection-end-column="6" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
@@ -53,49 +106,19 @@
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/accounts/models.py">
<entry file="file://$PROJECT_DIR$/templates/events/event_images_form.html">
<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 relative-caret-position="160">
<caret line="29" column="52" selection-start-line="29" selection-start-column="40" selection-end-line="29" selection-end-column="52" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/templates/accounts/user_form.html">
<entry file="file://$PROJECT_DIR$/events/urls.py">
<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>
</file>
<file pinned="false" current-in-tab="false">
<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>
</file>
<file pinned="false" current-in-tab="false">
<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" />
<state relative-caret-position="220">
<caret line="12" column="79" selection-start-line="12" selection-start-column="63" selection-end-line="12" selection-end-column="79" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
@@ -106,8 +129,8 @@
<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" />
<state relative-caret-position="-1040">
<caret line="26" column="15" lean-forward="true" selection-start-line="26" selection-start-column="15" selection-end-line="26" selection-end-column="15" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
@@ -115,27 +138,6 @@
</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="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>
</file>
<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="-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>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
@@ -158,7 +160,6 @@
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/templates/events/example.html" />
<option value="$PROJECT_DIR$/events/models.py" />
<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" />
@@ -166,16 +167,30 @@
<option value="$PROJECT_DIR$/templates/events/event_images_list.html" />
<option value="$PROJECT_DIR$/events/urls.py" />
<option value="$PROJECT_DIR$/events/views.py" />
<option value="$PROJECT_DIR$/events/forms.py" />
<option value="$PROJECT_DIR$/templatetags/__init__.py" />
<option value="$PROJECT_DIR$/templatetags/form_filters.py" />
<option value="$PROJECT_DIR$/templates/accounts/login.html" />
<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" />
<option value="$PROJECT_DIR$/accounts/manager.py" />
<option value="$PROJECT_DIR$/accounts/models.py" />
<option value="$PROJECT_DIR$/api/views/user.py" />
<option value="$PROJECT_DIR$/api/urls.py" />
<option value="$PROJECT_DIR$/mobile_web_api/views/__init__.py" />
<option value="$PROJECT_DIR$/mobile_web_api/forms/event_forms.py" />
<option value="$PROJECT_DIR$/mobile_web_api/forms/__init__.py" />
<option value="$PROJECT_DIR$/mobile_web_api/apps.py" />
<option value="$PROJECT_DIR$/events/forms.py" />
<option value="$PROJECT_DIR$/events/models.py" />
<option value="$PROJECT_DIR$/mobile_web_api/forms/user_forms.py" />
<option value="$PROJECT_DIR$/eventify/settings.py" />
<option value="$PROJECT_DIR$/mobile_web_api/views/user.py" />
<option value="$PROJECT_DIR$/mobile_web_api/urls.py" />
<option value="$PROJECT_DIR$/mobile_web_api/views/events.py" />
<option value="$PROJECT_DIR$/templates/events/event_list.html" />
<option value="$PROJECT_DIR$/eventify/urls.py" />
</list>
</option>
</component>
@@ -199,6 +214,11 @@
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="accounts" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
@@ -207,7 +227,39 @@
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="templates" type="462c0819:PsiDirectoryNode" />
<item name="events" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="master_data" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="mobile_web_api" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="mobile_web_api" type="462c0819:PsiDirectoryNode" />
<item name="forms" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="mobile_web_api" type="462c0819:PsiDirectoryNode" />
<item name="views" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="static" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="eventify_prod" type="b2602c69:ProjectViewProjectNode" />
<item name="eventify_prod" type="462c0819:PsiDirectoryNode" />
<item name="staticfiles" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
@@ -219,10 +271,20 @@
<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/mobile_web_api/forms" />
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="nodejs_npm_path_reset_for_default_project" value="true" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="C:\Users\vivek\Desktop\eventify_prod\mobile_web_api\forms" />
<recent name="C:\Users\vivek\Desktop\eventify_prod\api\urls" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\vivek\Desktop\eventify_prod\api" />
<recent name="C:\Users\vivek\Desktop\eventify_prod\api\views" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
@@ -271,7 +333,7 @@
<option name="presentableId" value="Default" />
<updated>1764194364815</updated>
<workItem from="1764194366807" duration="12589000" />
<workItem from="1764319665186" duration="6656000" />
<workItem from="1764319665186" duration="20473000" />
</task>
<task id="LOCAL-00001" summary="Changes in the settings for the deployment">
<created>1764280838609</created>
@@ -298,7 +360,7 @@
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="19245000" />
<option name="totallyTimeSpent" value="33062000" />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
@@ -307,7 +369,7 @@
<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" />
<window_info anchor="bottom" id="Find" order="1" weight="0.32840723" />
<window_info anchor="bottom" id="Find" order="1" weight="0.32784185" />
<window_info anchor="bottom" id="Run" order="2" />
<window_info anchor="bottom" id="Debug" order="3" weight="0.4" />
<window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
@@ -336,74 +398,6 @@
<option name="LAST_COMMIT_MESSAGE" value="Changes" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/.env.example">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="-240" />
<second_editor />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/contrib/auth/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="354" column="5" selection-start-line="354" selection-start-column="5" selection-end-line="354" selection-end-column="5" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/master_data/migrations/0001_initial.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/templates/accounts/user_confirm_delete.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/master_data/models.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/master_data/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="160">
<caret line="8" column="36" selection-start-line="8" selection-start-column="35" selection-end-line="8" selection-end-column="36" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/views/generic/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1774">
<caret line="35" column="6" selection-start-line="35" selection-start-column="6" selection-end-line="35" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="118">
<caret line="103" column="41" selection-start-line="103" selection-start-column="41" selection-end-line="103" selection-end-column="41" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/views/generic/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="40">
<caret line="10" column="42" selection-start-line="10" selection-start-column="42" selection-end-line="10" selection-end-column="42" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/example.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="40" lean-forward="true" selection-start-line="40" selection-end-line="40" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_list.html">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/views/generic/list.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="241">
@@ -445,50 +439,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="37" selection-start-line="37" selection-end-line="43" selection-end-column="36" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_images_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="34" column="14" lean-forward="true" selection-start-line="34" selection-start-column="14" selection-end-line="34" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_images_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
<caret line="10" lean-forward="true" selection-start-line="10" selection-end-line="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="9" column="83" selection-start-line="9" selection-start-column="83" selection-end-line="9" selection-end-column="83" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="200">
<caret line="86" column="44" lean-forward="true" selection-start-line="86" selection-start-column="44" selection-end-line="86" selection-end-column="44" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/requirements_1.txt">
<provider selected="true" editor-type-id="text-editor" />
</entry>
@@ -518,16 +468,6 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="660">
<caret line="35" column="15" selection-start-line="35" selection-start-column="15" selection-end-line="35" selection-end-column="15" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/contrib/auth/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="61">
@@ -548,14 +488,14 @@
<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" />
<caret line="12" column="51" 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" />
<caret line="54" selection-start-line="54" selection-end-line="54" />
</state>
</provider>
</entry>
@@ -566,17 +506,24 @@
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/django/forms/models.py">
<entry file="file://$PROJECT_DIR$/templates/base.html">
<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 relative-caret-position="-155">
<caret line="35" column="27" selection-start-line="35" selection-start-column="27" selection-end-line="35" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/manager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="600">
<caret line="30" selection-start-line="30" selection-end-line="30" />
</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" />
<state relative-caret-position="220">
<caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
@@ -585,28 +532,227 @@
</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" />
<state relative-caret-position="320">
<caret line="23" column="28" lean-forward="true" selection-start-line="23" selection-start-column="28" selection-end-line="23" selection-end-column="28" />
<folding>
<element signature="e#0#51#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/api/urls/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/forms/event_forms.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/forms/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state>
<caret column="25" lean-forward="true" selection-start-column="25" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/admin.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/__init__.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/apps.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="100">
<caret line="5" column="26" selection-start-line="5" selection-start-column="26" selection-end-line="5" selection-end-column="26" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/migrations/0003_event_end_time_event_start_time.py">
<provider selected="true" editor-type-id="text-editor" />
</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" />
<state relative-caret-position="133">
<caret line="73" column="12" selection-start-line="73" selection-start-column="4" selection-end-line="73" selection-end-column="12" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/eventify/settings.py">
<entry file="file://C:/Python38/Lib/site-packages/django/contrib/auth/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1">
<caret line="63" column="24" selection-start-line="63" selection-start-column="17" selection-end-line="63" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/forms/user_forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="261">
<caret line="42" lean-forward="true" selection-start-line="42" selection-end-line="42" />
<folding>
<element signature="e#20#44#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/rest_framework/authtoken/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="60">
<caret line="8" column="6" selection-start-line="8" selection-start-column="6" selection-end-line="8" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-100">
<caret line="57" column="16" lean-forward="true" selection-start-line="57" selection-start-column="16" selection-end-line="57" selection-end-column="16" />
<folding>
<element signature="e#0#35#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/master_data/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="40">
<caret line="2" selection-start-line="2" selection-end-line="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/views/user.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="6" selection-start-line="6" selection-end-line="6" selection-end-column="49" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/~jango/db/models/fields/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="121">
<caret line="949" column="8" selection-start-line="949" selection-start-column="8" selection-end-line="949" selection-end-column="8" />
</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="601">
<caret line="114" column="31" lean-forward="true" selection-start-line="114" selection-start-column="31" selection-end-line="114" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/rest_framework/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="108" column="62" lean-forward="true" selection-start-line="108" selection-start-column="62" selection-end-line="108" selection-end-column="62" />
</state>
</provider>
</entry>
<entry file="file://C:/Python38/Lib/site-packages/rest_framework/authentication.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="61">
<caret line="177" column="39" selection-start-line="177" selection-start-column="15" selection-end-line="177" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/views/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="40">
<caret line="2" lean-forward="true" selection-start-line="2" selection-end-line="2" />
<folding>
<element signature="e#0#19#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="140">
<caret line="17" column="38" selection-start-line="17" selection-start-column="38" selection-end-line="17" selection-end-column="38" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/views/events.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="113">
<caret line="109" column="6" selection-start-line="109" selection-start-column="6" selection-end-line="109" selection-end-column="6" />
<folding>
<element signature="e#0#36#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/mobile_web_api/models.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/events/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-179">
<caret line="38" column="6" selection-start-line="38" selection-start-column="6" selection-end-line="38" selection-end-column="6" />
<folding>
<element signature="e#0#24#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_images_form.html">
<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" />
<caret line="29" column="52" selection-start-line="29" selection-start-column="40" selection-end-line="29" selection-end-column="52" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="173">
<caret line="68" column="44" selection-start-line="68" selection-start-column="44" selection-end-line="68" selection-end-column="44" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="220">
<caret line="12" column="79" selection-start-line="12" selection-start-column="63" selection-end-line="12" selection-end-column="79" />
<folding>
<element signature="e#0#28#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="240">
<caret line="33" column="21" selection-start-line="33" selection-start-column="21" selection-end-line="33" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/events/event_images_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="80">
<caret line="10" selection-start-line="10" selection-end-line="10" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/events/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="245">
<caret line="50" selection-start-line="50" selection-end-line="50" />
<folding>
<element signature="e#0#28#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="-1040">
<caret line="26" column="15" lean-forward="true" selection-start-line="26" selection-start-column="15" selection-end-line="26" selection-end-column="15" />
<folding>
<element signature="e#0#9#0" expanded="true" />
</folding>
@@ -615,30 +761,13 @@
</entry>
<entry file="file://$PROJECT_DIR$/eventify/urls.py">
<provider selected="true" editor-type-id="text-editor">
<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" />
<state relative-caret-position="20">
<caret line="7" column="32" selection-start-line="7" selection-start-column="32" selection-end-line="7" selection-end-column="32" />
<folding>
<element signature="e#0#32#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/accounts/views.py">
<provider selected="true" editor-type-id="text-editor">
<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$/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<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>
</component>
</project>

30
accounts/manager.py Normal file
View File

@@ -0,0 +1,30 @@
from django.contrib.auth.models import BaseUserManager
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, username, email=None, password=None, **extra_fields):
if not username:
raise ValueError("Users must have a username")
if not email:
raise ValueError("Users must provide an email")
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, email=None, password=None, **extra_fields):
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
extra_fields.setdefault("role", "Admin") # Automatically Admin
extra_fields.setdefault("phone_number", "") # Optional
if extra_fields.get("is_staff") is not True:
raise ValueError("Superuser must have is_staff=True")
if extra_fields.get("is_superuser") is not True:
raise ValueError("Superuser must have is_superuser=True")
return self.create_user(username, email, password, **extra_fields)

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.21 on 2025-11-28 15:00
import accounts.manager
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('accounts', '0001_initial'),
]
operations = [
migrations.AlterModelManagers(
name='user',
managers=[
('objects', accounts.manager.UserManager()),
],
),
migrations.AlterField(
model_name='user',
name='role',
field=models.CharField(choices=[('Admin', 'Admin'), ('Manager', 'Manager'), ('Staff', 'Staff')], default='Staff', max_length=20),
),
]

View File

@@ -1,13 +1,24 @@
from django.contrib.auth.models import AbstractUser
from django.db import models
from accounts.manager import UserManager
ROLE_CHOICES = (
('Admin', 'Admin'),
('Manager', 'Manager'),
('Staff', 'Staff'),
)
class User(AbstractUser):
phone_number = models.CharField(max_length=15, blank=True, null=True)
role = models.CharField(max_length=50, blank=True, null=True)
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='Staff')
is_staff = models.BooleanField(default=False)
is_customer = models.BooleanField(default=False)
is_user = models.BooleanField(default=False)
objects = UserManager()
def __str__(self):
return self.username

View File

@@ -25,7 +25,10 @@ INSTALLED_APPS = [
'master_data',
'events',
'accounts',
'templatetags'
'templatetags',
'mobile_web_api',
'rest_framework',
'rest_framework.authtoken'
]
MIDDLEWARE = [

View File

@@ -4,6 +4,8 @@ from django.contrib.auth import views as auth_views
from accounts.views import dashboard
from accounts.views import login_view
from accounts.views import logout_view
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
@@ -16,4 +18,7 @@ urlpatterns = [
path('master-data/', include('master_data.urls')),
path('events/', include('events.urls')),
path('accounts/', include('accounts.urls')),
path('api/', include('mobile_web_api.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@@ -10,8 +10,13 @@ class EventForm(forms.ModelForm):
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control'}),
'description': forms.Textarea(attrs={'class': 'form-control'}),
'title': forms.TextInput(attrs={'class': 'form-control'}),
'important_information': forms.Textarea(attrs={'class': 'form-control'}),
'venue_name': forms.TextInput(attrs={'class': 'form-control'}),
'start_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
'end_date': forms.DateInput(attrs={'class': 'form-control', 'type': 'date'}),
'start_time': forms.TimeInput(attrs={'class': 'form-control', 'type': 'time'}),
'end_time': forms.TimeInput(attrs={'class': 'form-control', 'type': 'time'}),
'latitude': forms.NumberInput(attrs={'class': 'form-control'}),
'longitude': forms.NumberInput(attrs={'class': 'form-control'}),
'pincode': forms.TextInput(attrs={'class': 'form-control'}),

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.21 on 2025-11-28 20:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('events', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='event',
name='important_information',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='event',
name='title',
field=models.CharField(blank=True, max_length=250),
),
migrations.AddField(
model_name='event',
name='venue_name',
field=models.CharField(blank=True, max_length=250),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.21 on 2025-11-28 21:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('events', '0002_event_important_information_event_title_and_more'),
]
operations = [
migrations.AddField(
model_name='event',
name='end_time',
field=models.TimeField(blank=True, null=True),
),
migrations.AddField(
model_name='event',
name='start_time',
field=models.TimeField(blank=True, null=True),
),
]

View File

@@ -8,6 +8,8 @@ class Event(models.Model):
description = models.TextField()
start_date = models.DateField()
end_date = models.DateField()
start_time = models.TimeField(blank=True, null=True)
end_time = models.TimeField(blank=True, null=True)
latitude = models.DecimalField(max_digits=9, decimal_places=6)
longitude = models.DecimalField(max_digits=9, decimal_places=6)
@@ -31,6 +33,10 @@ class Event(models.Model):
], default='pending')
cancelled_reason = models.TextField(default='NA')
title = models.CharField(max_length=250, blank=True)
important_information = models.TextField(blank=True)
venue_name = models.CharField(max_length=250, blank=True)
def __str__(self):
return f"{self.name} ({self.start_date})"

View File

3
mobile_web_api/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
mobile_web_api/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class MobileWebApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'mobile_web_api'

View File

@@ -0,0 +1 @@
from .user_forms import *

View File

View File

@@ -0,0 +1,42 @@
# accounts/forms.py
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth import authenticate
User = get_user_model()
class RegisterForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput)
class Meta:
model = User
fields = ['email', 'phone_number', 'password']
def clean_email(self):
phone_number = self.cleaned_data.get('phone_number')
if User.objects.filter(phone_number=phone_number).exists():
raise forms.ValidationError("phone_number is already registered.")
return phone_number
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data['password'])
if commit:
user.save()
return user
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get('username')
password = cleaned_data.get('password')
user = authenticate(username=username, password=password)
if not user:
raise forms.ValidationError("Invalid credentials.")
cleaned_data['user'] = user
return cleaned_data

View File

3
mobile_web_api/models.py Normal file
View File

@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

3
mobile_web_api/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

21
mobile_web_api/urls.py Normal file
View File

@@ -0,0 +1,21 @@
from django.urls import path
from .views import *
# User URLS
urlpatterns = [
path('user/register/', RegisterView.as_view(), name='json_register'),
path('user/login/', LoginView.as_view(), name='json_login'),
path('user/status/', StatusView.as_view(), name='user_status'),
path('user/logout/', LogoutView.as_view(), name='user_logout'),
]
# Event URLS
urlpatterns += [
path('events/type-list/', EventTypeListAPIView.as_view()),
path('events/pincode-events/', EventListAPI.as_view()),
path('events/event-details/', EventDetailAPI.as_view()),
path('events/<int:event_id>/images/', EventImagesListAPI.as_view()),
]

View File

@@ -0,0 +1,2 @@
from .user import *
from .events import *

View File

@@ -0,0 +1,162 @@
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.authentication import TokenAuthentication
from rest_framework.permissions import IsAuthenticated
from events.models import Event, EventImages
from rest_framework.authtoken.models import Token
from master_data.models import EventType
from django.forms.models import model_to_dict
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
import json
@method_decorator(csrf_exempt, name='dispatch')
class EventTypeListAPIView(APIView):
def post(self, request):
try:
# Manually load JSON because we are not using parsers
data = json.loads(request.body)
token_key = data.get("token")
username = data.get("username")
if not token_key or not username:
return JsonResponse(
{"status": "error", "message": "token and username required"}
)
try:
token = Token.objects.get(key=token_key)
user = token.user
if user.username != username:
return JsonResponse(
{"status": "error", "message": "token does not match user"}
)
# Fetch event types manually without serializer
event_types = list(EventType.objects.values("id", "event_type"))
return JsonResponse({
"status": "success",
"event_types": event_types
})
except Token.DoesNotExist:
return JsonResponse({"status": "invalid_token"})
except json.JSONDecodeError:
return JsonResponse(
{"status": "error", "message": "Invalid JSON"}
)
except Exception as e:
return JsonResponse(
{"status": "error", "message": str(e)},
)
class EventListAPI(APIView):
def post(self, request):
try:
data = json.loads(request.body)
token_key = data.get("token")
username = data.get("username")
pincode = data.get("pincode")
if not token_key or not username:
return JsonResponse(
{"status": "error", "message": "token and username required"}
)
try:
token = Token.objects.get(key=token_key)
user = token.user
if user.username != username:
return JsonResponse(
{"status": "error", "message": "token does not match user"}
)
events = Event.objects.filter(pincode=pincode).order_by('-created_date')
event_list = []
for e in events:
event_list.append(model_to_dict(e))
return JsonResponse({
"status": "success",
"events": event_list
})
except Token.DoesNotExist:
return JsonResponse({"status": "invalid_token"})
except json.JSONDecodeError:
return JsonResponse(
{"status": "error", "message": "Invalid JSON"}
)
except Exception as e:
return JsonResponse(
{"status": "error", "message": str(e)},
)
class EventDetailAPI(APIView):
def post(self, request):
try:
data = json.loads(request.body)
token_key = data.get("token")
username = data.get("username")
event_id = data.get("event_id")
if not token_key or not username:
return JsonResponse(
{"status": "error", "message": "token and username required"}
)
try:
token = Token.objects.get(key=token_key)
user = token.user
if user.username != username:
return JsonResponse(
{"status": "error", "message": "token does not match user"}
)
events = Event.objects.get(id=event_id)
data = model_to_dict(events)
data["status"] = "success"
return JsonResponse(data)
except Token.DoesNotExist:
return JsonResponse({"status": "invalid_token"})
except json.JSONDecodeError:
return JsonResponse(
{"status": "error", "message": "Invalid JSON"}
)
except Exception as e:
return JsonResponse(
{"status": "error", "message": str(e)},
)
class EventImagesListAPI(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request, event_id):
images = EventImages.objects.filter(event_id=event_id)
image_list = [model_to_dict(i) for i in images]
return JsonResponse({"status": True, "images": image_list}, safe=False)

View File

@@ -0,0 +1,124 @@
# accounts/views.py
import json
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.utils.decorators import method_decorator
from django.views import View
from rest_framework.authtoken.models import Token
from mobile_web_api.forms import RegisterForm, LoginForm
from rest_framework.authentication import TokenAuthentication
from django.contrib.auth import logout
@method_decorator(csrf_exempt, name='dispatch')
class RegisterView(View):
def post(self, request):
try:
data = json.loads(request.body)
form = RegisterForm(data)
if form.is_valid():
user = form.save()
token, _ = Token.objects.get_or_create(user=user)
return JsonResponse({'message': 'User registered successfully', 'token': token.key}, status=201)
return JsonResponse({'errors': form.errors}, status=400)
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
@method_decorator(csrf_exempt, name='dispatch')
class LoginView(View):
def post(self, request):
try:
data = json.loads(request.body)
form = LoginForm(data)
if form.is_valid():
user = form.cleaned_data['user']
token, _ = Token.objects.get_or_create(user=user)
return JsonResponse({'message': 'Login successful', 'token': token.key})
return JsonResponse({'errors': form.errors}, status=401)
except Exception as e:
return JsonResponse({'error': str(e)}, status=500)
@method_decorator(csrf_exempt, name='dispatch')
class StatusView(View):
def post(self, request):
try:
data = json.loads(request.body)
token_key = data.get("token")
username = data.get("username")
if not token_key or not username:
return JsonResponse(
{"status": "error", "message": "token and username required"},
status=400
)
try:
token = Token.objects.get(key=token_key)
if token.user.username != username:
return JsonResponse(
{"status": "error", "message": "token does not match user"},
status=401
)
return JsonResponse({
"status": "logged_in",
"username": token.user.username,
"email": token.user.email
})
except Token.DoesNotExist:
return JsonResponse({"status": "invalid_token"}, status=401)
except json.JSONDecodeError:
return JsonResponse({"status": "error", "message": "Invalid JSON"}, status=400)
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)
@method_decorator(csrf_exempt, name='dispatch')
class LogoutView(View):
def post(self, request):
try:
data = json.loads(request.body)
token_key = data.get("token")
username = data.get("username")
if not token_key or not username:
return JsonResponse(
{"status": "error", "message": "token and username required"},
status=400
)
try:
token = Token.objects.get(key=token_key)
user = token.user
if user.username != username:
return JsonResponse(
{"status": "error", "message": "token does not match user"},
status=401
)
# 🔍 Call Django's built-in logout
logout(request)
# 🗑 Delete the token to invalidate future access
token.delete()
return JsonResponse({
"status": "logged_out",
"message": "Logout successful"
})
except Token.DoesNotExist:
return JsonResponse({"status": "invalid_token"}, status=401)
except json.JSONDecodeError:
return JsonResponse({"status": "error", "message": "Invalid JSON"}, status=400)
except Exception as e:
return JsonResponse({"status": "error", "message": str(e)}, status=500)

View File

@@ -1,27 +1,43 @@
{% extends 'base.html' %}
{% block content %}
<div class="d-flex justify-content-between mb-3">
<h3>Events</h3>
<a class="btn btn-success" href="{% url 'events:event_add' %}">Add Event</a>
</div>
<table class="table table-hover">
<thead><tr><th>#</th><th>Name</th><th>Type</th><th>Dates</th><th>Place</th><th>Actions</th></tr></thead>
<tbody>
{% for e in events %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ e.name }}</td>
<td>{{ e.event_type }}</td>
<td>{{ e.start_date }} - {{ e.end_date }}</td>
<td>{{ e.place }}</td>
<td>
<a class="btn btn-sm btn-primary" href="{% url 'events:event_edit' e.pk %}">Edit</a>
<a class="btn btn-sm btn-danger" href="{% url 'events:event_delete' e.pk %}">Delete</a>
</td>
</tr>
{% empty %}
<tr><td colspan="6">No events found.</td></tr>
{% endfor %}
</tbody>
</table>
<div class="d-flex justify-content-between mb-3">
<h3>Events</h3>
<a class="btn btn-success" href="{% url 'events:event_add' %}">Add Event</a>
</div>
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>Event ID</th>
<th>Name</th>
<th>Type</th>
<th>Dates</th>
<th>Place</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for e in events %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ e.id }}</td>
<td>{{ e.name }}</td>
<td>{{ e.event_type }}</td>
<td>{{ e.start_date }} - {{ e.end_date }}</td>
<td>{{ e.place }}</td>
<td>
<a class="btn btn-sm btn-primary" href="{% url 'events:event_edit' e.pk %}">Edit</a>
<a class="btn btn-sm btn-danger" href="{% url 'events:event_delete' e.pk %}">Delete</a>
<a class="btn btn-sm btn-warning" href="{% url 'events:add_event_images' e.pk %}">
Add Images
</a>
</td>
</tr>
{% empty %}
<tr>
<td colspan="6">No events found.</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}