From a0d09feaef385c8366cc6fcca991a6ab796ae896 Mon Sep 17 00:00:00 2001 From: ismail Date: Thu, 9 Oct 2025 18:06:36 +0300 Subject: [PATCH] fix the form wizard --- .../__pycache__/settings.cpython-313.pyc | Bin 5225 -> 5232 bytes .../__pycache__/urls.cpython-313.pyc | Bin 1535 -> 2176 bytes NorahUniversity/settings.py | 2 +- NorahUniversity/urls.py | 14 ++++++-- db.sqlite3 | Bin 643072 -> 643072 bytes recruitment/__pycache__/urls.cpython-313.pyc | Bin 6478 -> 5754 bytes recruitment/__pycache__/views.cpython-313.pyc | Bin 36329 -> 36759 bytes recruitment/urls.py | 10 ++---- recruitment/views.py | 9 +++-- templates/forms/form_wizard.html | 34 ++++++++++++------ 10 files changed, 45 insertions(+), 24 deletions(-) diff --git a/NorahUniversity/__pycache__/settings.cpython-313.pyc b/NorahUniversity/__pycache__/settings.cpython-313.pyc index b611091643af3dd5d92d1bf93673663119ebf9d8..b6f4ada70ad7bcd970a163cc9981a567d5a0e7a9 100644 GIT binary patch delta 456 zcmXv~yGjF56uf6$6SKPJX<`yLM&lz7v%6}d@oka9cA3IP1Ph5;D4qy{7J-1hvaKH> zG9sZ(G41H*~O~b VM}9DNphpvr!#yvS(DZ8|{{T_mWzPTr delta 456 zcmXv~yGjF56uftdtJ!2VZdUU!#%Rn-&EAbkjBi0KQrLvC5V5h4sNjR6DA)*s9}pH> zzrb#P!~ambfIr~Lq8Db0VP?*7`{nPl`D2=f;CKK2d3MkqDjm}XZ7*??yP&bd;BD2-W~Vq~~a$DE_lH1e3|X;~C# zhMS6mCT`E6l%-kTILFANO!KHvfej0Ph9WPNi{6)PJuUt3q%x{hfx}BxM>4w|iCVB~ z0n4u#p=E2K8NIti@{Zh$M8)SU=ppDfQv{1^%%fZBIsZ#xC&{Y3L}IJj1?>c zS0M{jVFD9J(7|#b75dyo(lOF8TuKaJH_FGbC^6IrE0{7u6q+(YX((Tpmw^GSfeomE zBgg__9E=4NwSut`bg-f&6PjKdge;5&)N2Q1%fk3j8lgE|NmF@p9@CxrDj}Q9yb`OD z)ZBuc#FEtb%oIEQTij{+MY-|inN^8JDVmJ8Sn?8cQ>!E~6&9B!8beQcF_x#cqi}Sg86ZdoimsDoie7eyt^d6c+JinW^PP{J_vG0wvudK@cGX zB7}j&OAzMR9TUL0RjT;Pk8^rF1!4&RF`UN=EPDhpDttC?R^ zGvASWk;MnBN^*wjb!n4}(k2(I11_=zf|bcFV7;zjaZ$nIf_?BsmJqO*_KMK!x~>;> zT`%|~Tx3ZEiy3Wjy>8-n(ZugUX!b>xoDb4`{7enp9~36fWmRJ2nS6lNngx`l0IJ{L AoB#j- delta 262 zcmZn={LiiNnU|M~0SIQaJ6^ynsoz9wg2N6z2%if$2ujKv6ve55@`>v1HQaWnciC3DIi+lS9xzy+#Ng zjD^sfE~+W^l3}t9^R3BRtm=$XlY>}aPtIWL=28KwWd!14*2#a_7IA*yX5(jS;Qk;o SS&l=Akz=wWhc(dk3=9BFUnXb( diff --git a/NorahUniversity/settings.py b/NorahUniversity/settings.py index baaf0bb..18e7295 100644 --- a/NorahUniversity/settings.py +++ b/NorahUniversity/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = 'django-insecure-_!ew&)1&r--3h17knd27^x8(xu(&-f4q3%x543lv5vx2!784s* # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] +ALLOWED_HOSTS = ["*"] # Application definition diff --git a/NorahUniversity/urls.py b/NorahUniversity/urls.py index 84c78b0..e386c91 100644 --- a/NorahUniversity/urls.py +++ b/NorahUniversity/urls.py @@ -16,15 +16,23 @@ urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), path('accounts/', include('allauth.urls')), - path('i18n/', include('django.conf.urls.i18n')), + path('i18n/', include('django.conf.urls.i18n')), path('summernote/', include('django_summernote.urls')), + # path('', include('recruitment.urls')), + path('/', views.form_wizard_view, name='form_wizard'), + path('/submit/', views.submit_form, name='submit_form'), + + path('api/templates/', views.list_form_templates, name='list_form_templates'), + path('api/templates/save/', views.save_form_template, name='save_form_template'), + path('api/templates//', views.load_form_template, name='load_form_template'), + path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), ] -# 2. URLs that DO have a language prefix (user-facing views) -# This includes the root path (''), which is handled by 'recruitment.urls' urlpatterns += i18n_patterns( path('', include('recruitment.urls')), ) +# 2. URLs that DO have a language prefix (user-facing views) +# This includes the root path (''), which is handled by 'recruitment.urls' urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) \ No newline at end of file diff --git a/db.sqlite3 b/db.sqlite3 index 1e9728d508c14b0642ba406495a0ef0d63cc9795..51acf4d2a5ce4d7b3251cc0139d02e8269382def 100644 GIT binary patch delta 3246 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 delta 7086 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 s9{5iDm!kG_+ucHB->_@8d7p9f`a#/', views.form_wizard_view, name='form_wizard'), - path('forms/form//submit/', views.submit_form, name='submit_form'), - path('forms//submissions//', views.form_submission_details, name='form_submission_details'), + # path('forms/form//submit/', views.submit_form, name='submit_form'), + # path('forms/form//', views.form_wizard_view, name='form_wizard'), + path('forms//submissions//', views.form_submission_details, name='form_submission_details'), path('forms/template//submissions/', views.form_template_submissions_list, name='form_template_submissions_list'), - path('api/templates/', views.list_form_templates, name='list_form_templates'), - path('api/templates/save/', views.save_form_template, name='save_form_template'), - path('api/templates//', views.load_form_template, name='load_form_template'), - path('api/templates//delete/', views.delete_form_template, name='delete_form_template'), # path('forms//', views.form_preview, name='form_preview'), # path('forms//submit/', views.form_submit, name='form_submit'), # path('forms//embed/', views.form_embed, name='form_embed'), diff --git a/recruitment/views.py b/recruitment/views.py index 794ce67..8988606 100644 --- a/recruitment/views.py +++ b/recruitment/views.py @@ -33,6 +33,7 @@ from .utils import ( get_available_time_slots, ) from django.views.decorators.csrf import ensure_csrf_cookie +from django.views.decorators.http import require_POST from .models import ( FormTemplate, FormStage, @@ -814,10 +815,14 @@ def form_wizard_view(request, template_id): ) -@require_http_methods(["GET", "POST"]) +@require_POST def submit_form(request, template_id): """Handle form submission""" - print("request method", request.method) + print(f"Request method: {request}") + print(f"CSRF token in POST: {'csrfmiddlewaretoken' in request.POST}") + print(f"CSRF token value: {request.POST.get('csrfmiddlewaretoken', 'NOT FOUND')}") + print(f"POST data: {request.POST}") + print(f"FILES data: {request.FILES}") if request.method == "POST": try: template = get_object_or_404(FormTemplate, id=template_id) diff --git a/templates/forms/form_wizard.html b/templates/forms/form_wizard.html index 251a6ff..c2efea1 100644 --- a/templates/forms/form_wizard.html +++ b/templates/forms/form_wizard.html @@ -876,11 +876,10 @@ } const formData = new FormData(); + + // Add CSRF token as a form field (CRITICAL FIX) formData.append('csrfmiddlewaretoken', csrfToken); - // Add applicant info - //formData.append('applicant_name', state.formData.applicant_name || ''); - //formData.append('applicant_email', state.formData.applicant_email || ''); - console.log(state.formData) + // Add field responses state.stages.forEach(stage => { stage.fields.forEach(field => { @@ -898,22 +897,35 @@ }); try { - const response = await fetch(`/forms/form/${state.templateId}/submit/`, { + const response = await fetch(`/${state.templateId}/submit/`, { method: 'POST', body: formData + // IMPORTANT: Do NOT set Content-Type header when using FormData + // Do NOT set X-CSRFToken header when using csrfmiddlewaretoken in form data }); - const result = await response.json(); + // Check if response is OK + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const result = await response.json(); if (result.success) { alert('Application submitted successfully! Thank you for your submission.'); - window.location.href = '/templates/'; // Redirect to templates list + window.location.href = '/applications/'; // Redirect to applications list } else { - alert('Error submitting form: ' + result.error); + alert('Error submitting form: ' + (result.error || 'Unknown error')); } } catch (error) { - console.error('Error:', error); - alert('Error submitting form. Please try again.'); + console.error('Submission error:', error); + // Try to get response text for debugging + try { + const errorText = await response.text(); + console.error('Response text:', errorText); + alert('Error submitting form. Server response: ' + errorText); + } catch (e) { + alert('Error submitting form: ' + error.message); + } } } @@ -953,7 +965,7 @@ elements.nextBtn.style.display = 'flex'; elements.nextBtn.textContent = state.currentStage === state.stages.length - 1 ? 'Preview' : - 'Next' + 'Next' } function createFieldElement(field) {