Updates for the event images
This commit is contained in:
591
.idea/workspace.xml
generated
591
.idea/workspace.xml
generated
@@ -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
30
accounts/manager.py
Normal 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)
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
@@ -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
|
||||
|
||||
@@ -25,7 +25,10 @@ INSTALLED_APPS = [
|
||||
'master_data',
|
||||
'events',
|
||||
'accounts',
|
||||
'templatetags'
|
||||
'templatetags',
|
||||
'mobile_web_api',
|
||||
'rest_framework',
|
||||
'rest_framework.authtoken'
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'}),
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
]
|
||||
23
events/migrations/0003_event_end_time_event_start_time.py
Normal file
23
events/migrations/0003_event_end_time_event_start_time.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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})"
|
||||
|
||||
|
||||
0
mobile_web_api/__init__.py
Normal file
0
mobile_web_api/__init__.py
Normal file
3
mobile_web_api/admin.py
Normal file
3
mobile_web_api/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
mobile_web_api/apps.py
Normal file
6
mobile_web_api/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MobileWebApiConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'mobile_web_api'
|
||||
1
mobile_web_api/forms/__init__.py
Normal file
1
mobile_web_api/forms/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .user_forms import *
|
||||
0
mobile_web_api/forms/event_forms.py
Normal file
0
mobile_web_api/forms/event_forms.py
Normal file
42
mobile_web_api/forms/user_forms.py
Normal file
42
mobile_web_api/forms/user_forms.py
Normal 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
|
||||
0
mobile_web_api/migrations/__init__.py
Normal file
0
mobile_web_api/migrations/__init__.py
Normal file
3
mobile_web_api/models.py
Normal file
3
mobile_web_api/models.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
3
mobile_web_api/tests.py
Normal file
3
mobile_web_api/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
21
mobile_web_api/urls.py
Normal file
21
mobile_web_api/urls.py
Normal 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()),
|
||||
]
|
||||
2
mobile_web_api/views/__init__.py
Normal file
2
mobile_web_api/views/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .user import *
|
||||
from .events import *
|
||||
162
mobile_web_api/views/events.py
Normal file
162
mobile_web_api/views/events.py
Normal 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)
|
||||
124
mobile_web_api/views/user.py
Normal file
124
mobile_web_api/views/user.py
Normal 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)
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user