From 0ee098b607f546a1f57b66a6d5133af779e8f8d0 Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Wed, 13 Nov 2024 23:24:59 +0200 Subject: [PATCH 1/7] Set username in print covers --- .../apps/tally/templates/audit/print_cover.html | 4 ++++ .../tally/templates/clearance/print_cover.html | 4 ++++ .../apps/tally/templates/intake/print_cover.html | 15 +++++++++++++++ tally_ho/apps/tally/views/audit.py | 1 + tally_ho/apps/tally/views/clearance.py | 1 + tally_ho/apps/tally/views/intake.py | 1 + 6 files changed, 26 insertions(+) diff --git a/tally_ho/apps/tally/templates/audit/print_cover.html b/tally_ho/apps/tally/templates/audit/print_cover.html index 3dc831b1d..9de48435e 100644 --- a/tally_ho/apps/tally/templates/audit/print_cover.html +++ b/tally_ho/apps/tally/templates/audit/print_cover.html @@ -34,6 +34,10 @@

{% trans 'Audit Case: Team Page' %}

{% trans 'Date Supervisor Modified:' %} {{ result_form.audit.date_supervisor_modified }} + + {% trans 'Modified by:' %} + {{ username }} +

{% trans 'Problem' %}

diff --git a/tally_ho/apps/tally/templates/clearance/print_cover.html b/tally_ho/apps/tally/templates/clearance/print_cover.html index 97053f811..d385308f5 100644 --- a/tally_ho/apps/tally/templates/clearance/print_cover.html +++ b/tally_ho/apps/tally/templates/clearance/print_cover.html @@ -46,6 +46,10 @@

{% trans 'Clearance Case: Team Page' %}

{% else %} {% trans 'None' %} {% endif %} + + + +
{% trans 'Modified by:' %}{{ username }}

{% trans 'Problem' %}

diff --git a/tally_ho/apps/tally/templates/intake/print_cover.html b/tally_ho/apps/tally/templates/intake/print_cover.html index b42851eaa..41ddc86af 100644 --- a/tally_ho/apps/tally/templates/intake/print_cover.html +++ b/tally_ho/apps/tally/templates/intake/print_cover.html @@ -15,6 +15,21 @@

{% trans 'Cover Form' %}

+ + + + + + + + + + + + +
{% trans 'Intake: ' %}{% trans 'Successful' %}
{% trans 'Date/Time:' %}{{ result_form.modified_date }}
{% trans 'Intaken by:' %}{{ username }}
{% trans 'Intake Clerk:' %}{% trans 'Name:' %} + ________________________________________ +
{% trans 'Data Entry One:' %} {% trans 'Name:' %} diff --git a/tally_ho/apps/tally/views/audit.py b/tally_ho/apps/tally/views/audit.py index 358667ecc..5464ec39f 100644 --- a/tally_ho/apps/tally/views/audit.py +++ b/tally_ho/apps/tally/views/audit.py @@ -296,6 +296,7 @@ def get(self, *args, **kwargs): return self.render_to_response( self.get_context_data(result_form=result_form, + username=self.request.user.username, problems=problems, tally_id=tally_id)) diff --git a/tally_ho/apps/tally/views/clearance.py b/tally_ho/apps/tally/views/clearance.py index 628af2568..a890bb4f0 100644 --- a/tally_ho/apps/tally/views/clearance.py +++ b/tally_ho/apps/tally/views/clearance.py @@ -234,6 +234,7 @@ def get(self, *args, **kwargs): return self.render_to_response( self.get_context_data(result_form=result_form, + username=self.request.user.username, problems=problems, printed_url=reverse( self.printed_url, args=(pk,)), diff --git a/tally_ho/apps/tally/views/intake.py b/tally_ho/apps/tally/views/intake.py index fe00fb523..21023bb2d 100644 --- a/tally_ho/apps/tally/views/intake.py +++ b/tally_ho/apps/tally/views/intake.py @@ -337,6 +337,7 @@ def get(self, *args, **kwargs): return self.render_to_response( self.get_context_data( result_form=result_form, + username=self.request.user.username, printed_url=reverse(self.printed_url, args=(pk,),), tally_id=tally_id)) From 75e42f69105939ce5a349ac39990e3216ce26cf3 Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Wed, 13 Nov 2024 23:26:51 +0200 Subject: [PATCH 2/7] Check if clearance exists first --- tally_ho/apps/tally/views/clearance.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tally_ho/apps/tally/views/clearance.py b/tally_ho/apps/tally/views/clearance.py index a890bb4f0..a86d18710 100644 --- a/tally_ho/apps/tally/views/clearance.py +++ b/tally_ho/apps/tally/views/clearance.py @@ -385,11 +385,11 @@ def post(self, *args, **kwargs): self.request.user): possible_states.append(FormState.ARCHIVED) - if (result_form.form_state == FormState.CLEARANCE) &\ - (result_form.clearance is not None) &\ - (result_form.clearance.resolution_recommendation ==\ - ClearanceResolution.PENDING_FIELD_INPUT): - possible_states.append(FormState.CLEARANCE) + if result_form.clearance is not None: + if (result_form.form_state == FormState.CLEARANCE) &\ + (result_form.clearance.resolution_recommendation ==\ + ClearanceResolution.PENDING_FIELD_INPUT): + possible_states.append(FormState.CLEARANCE) form = safe_form_in_state(result_form, possible_states, form) From 8f6f26fea8cc5e95a651d34a4917c3538714f7d9 Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Wed, 13 Nov 2024 23:41:10 +0200 Subject: [PATCH 3/7] Clean up audit and clearance review process --- .../apps/tally/templates/audit/review.html | 84 ++++++++++++------- .../tally/templates/clearance/review.html | 70 ++++++++++++++-- .../apps/tally/templatetags/app_filters.py | 28 ++++++- tally_ho/apps/tally/views/audit.py | 9 +- tally_ho/apps/tally/views/clearance.py | 15 +--- 5 files changed, 149 insertions(+), 57 deletions(-) diff --git a/tally_ho/apps/tally/templates/audit/review.html b/tally_ho/apps/tally/templates/audit/review.html index 5aaa6bb78..1bf1a2103 100644 --- a/tally_ho/apps/tally/templates/audit/review.html +++ b/tally_ho/apps/tally/templates/audit/review.html @@ -26,6 +26,58 @@

{% trans 'Quarantined Form' %}

+
+
+ {% if form.blank_reconciliation.value or form.blank_results.value or form.unclear_figures.value or form.damaged_form.value or form.other.value %} +

{% trans "Problem" %}

+ {% endif %} + {% if form.blank_reconciliation.value %} +

+ {% endif %} + {% if form.blank_results.value %} +

+ {% endif %} + {% if form.unclear_figures.value %} +

+ {% endif %} + {% if form.damaged_form.value %} +

+ {% endif %} + {% if form.other.value %} +

{{ form.other.value }}

+

+ {% endif %} + + {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' or form.resolution_recommendation.value|get_audit_resolution_name != '----' %} +

{% trans "Action Prior to Recommendation" %}

+ {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' %} +

+ {{ form.action_prior_to_recommendation.value|get_audit_action_name }} +

+ {% endif %} + {% if form.resolution_recommendation.value|get_audit_resolution_name != '----' %} +

+ {{ form.resolution_recommendation.value|get_audit_resolution_name }} +

+ {% endif %} + {% endif %} +
+
+ {% if form.team_comment.value %} +

+ {{ form.team_comment.value }} +

+ {% endif %} + {% if not is_clerk %} + {% if form.supervisor_comment.value %} +

+ {{ form.supervisor_comment.value }} +

+ {% endif %} + {% endif %} +
+

{% trans "Problem" %}

{{ form.blank_reconciliation }}

@@ -34,7 +86,10 @@

{% trans "Problem" %}

{{ form.damaged_form }}

{{ form.other }}

-

+

+ + {% trans "Cancel" %} +

{% trans "Action Prior to Recommendation" %}

{{ form.action_prior_to_recommendation }} @@ -49,34 +104,7 @@

{% trans "Action Prior to Recommendation" %}

{% endif %}
- {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' or form.action_prior_to_recommendation.value|get_audit_action_name != '----' %} -
-

{% trans "Action Prior to Recommendation" %}

- {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' %} -

- {{ form.action_prior_to_recommendation.value|get_audit_action_name }} -

- {% endif %} - {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' %} -

- {{ form.resolution_recommendation.value|get_audit_resolution_name }} -

- {% endif %} -
- {% endif %}
- {% if form.team_comment.value %} -

- {{ form.team_comment.value }} -

- {% endif %} - {% if not is_clerk %} - {% if form.supervisor_comment.value %} -

- {{ form.supervisor_comment.value }} -

- {% endif %} - {% endif %} {% if is_clerk %}

{{ form.team_comment }} diff --git a/tally_ho/apps/tally/templates/clearance/review.html b/tally_ho/apps/tally/templates/clearance/review.html index 3d437b285..7915112c6 100644 --- a/tally_ho/apps/tally/templates/clearance/review.html +++ b/tally_ho/apps/tally/templates/clearance/review.html @@ -1,6 +1,7 @@ {% extends 'base.html' %} {% load i18n %} +{% load app_filters %} {% block content %} @@ -12,6 +13,66 @@

{% trans 'Clearance:' %} {{ clearance_type }}

+
+
+ {% if form.center_name_missing.value or form.center_name_mismatching.value or form.center_code_missing.value or form.center_code_mismatching.value or form.form_already_in_system.value or form.form_incorrectly_entered_into_system.value or form.other.value %} +

{% trans "Problem" %}

+ {% endif %} + {% if form.center_name_missing.value %} +

+ {% endif %} + {% if form.center_name_mismatching.value %} +

+ {% endif %} + {% if form.center_code_missing.value %} +

+ {% endif %} + {% if form.center_code_mismatching.value %} +

+ {% endif %} + {% if form.form_already_in_system.value %} +

+ {% endif %} + {% if form.form_incorrectly_entered_into_system.value %} +

+ {% endif %} + {% if form.other.value %} +

{{ form.other.value }}

+ {% endif %} + + {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' or form.resolution_recommendation.value|get_clearance_resolution_name != '----' %} +

{% trans "Action Prior to Recommendation" %}

+ {% if form.action_prior_to_recommendation.value|get_audit_action_name != '----' %} +

+ {{ form.action_prior_to_recommendation.value|get_audit_action_name }} +

+ {% endif %} + {% if form.resolution_recommendation.value|get_clearance_resolution_name != '----' %} +

+ {{ form.resolution_recommendation.value|get_clearance_resolution_name }} +

+ {% endif %} + {% endif %} +
+
+ {% if form.team_comment.value %} +

+ {{ form.team_comment.value }} +

+ {% endif %} + {% if not is_clerk %} + {% if form.supervisor_comment.value %} +

+ {{ form.supervisor_comment.value }} +

+ {% endif %} + {% endif %} +
+

{% trans "Problem" %}

{{ form.center_name_missing }}

{{ form.other }}

-

+

+ + {% trans "Cancel" %} +

{% trans "Action Prior to Recommendation" %}

{{ form.action_prior_to_recommendation }} @@ -51,10 +115,6 @@

{% trans "Action Prior to Recommendation" %}

{{ form.team_comment }}

- {% else %} -

- {{ form.team_comment.value }} -

{% endif %} {% if not is_clerk %}

diff --git a/tally_ho/apps/tally/templatetags/app_filters.py b/tally_ho/apps/tally/templatetags/app_filters.py index b737fa128..0d33383e2 100644 --- a/tally_ho/apps/tally/templatetags/app_filters.py +++ b/tally_ho/apps/tally/templatetags/app_filters.py @@ -3,6 +3,7 @@ from tally_ho.apps.tally.models.tally import Tally from tally_ho.libs.models.enums.actions_prior import ActionsPrior from tally_ho.libs.models.enums.audit_resolution import AuditResolution +from tally_ho.libs.models.enums.clearance_resolution import ClearanceResolution register = template.Library() @@ -67,7 +68,7 @@ def get_audit_action_name(action_prior_enum): return action_prior_name -def get_audti_resolution_label_by_number(choice_number): +def get_audit_resolution_label_by_number(choice_number): for number, choice_label in AuditResolution.choices(): if number == choice_number: return choice_label @@ -83,8 +84,31 @@ def get_audit_resolution_name(audit_resolution_enum): audit_resolution_name = None try: audit_resolution_name =\ - get_audti_resolution_label_by_number(audit_resolution_enum.value) + get_audit_resolution_label_by_number(audit_resolution_enum.value) except AttributeError: pass return audit_resolution_name + +def get_clearance_resolution_label_by_number(choice_number): + for number, choice_label in ClearanceResolution.choices(): + if number == choice_number: + return choice_label + +@register.filter(name="get_clearance_resolution_name") +def get_clearance_resolution_name(clearance_resolution_enum): + """Get clearance resolution name. + + :param clearance_resolution_enum: Clearance resolution enum + + :returns: Clearance resolution name as a String. + """ + clearance_resolution_name = None + try: + clearance_resolution_name =\ + get_clearance_resolution_label_by_number( + clearance_resolution_enum.value) + except AttributeError: + pass + + return clearance_resolution_name diff --git a/tally_ho/apps/tally/views/audit.py b/tally_ho/apps/tally/views/audit.py index 5464ec39f..b8cda8b4a 100644 --- a/tally_ho/apps/tally/views/audit.py +++ b/tally_ho/apps/tally/views/audit.py @@ -91,7 +91,7 @@ def audit_action(audit, post_data, result_form, url): [ActionsPrior.REQUEST_AUDIT_ACTION_FROM_FIELD, ActionsPrior.REQUEST_COPY_FROM_FIELD]: audit.active = True - result_form.reject(new_state=FormState.AUDIT) + audit.reviewed_supervisor = False else: audit.active = False result_form.reject(new_state=FormState.DATA_ENTRY_1) @@ -372,13 +372,6 @@ def post(self, *args, **kwargs): if groups.SUPER_ADMINISTRATOR in groups.user_groups( self.request.user): possible_states.append(FormState.ARCHIVED) - if result_form.audit is not None: - if (result_form.form_state == FormState.AUDIT) &\ - (result_form.audited_count > 0) &\ - (result_form.audit.action_prior_to_recommendation in\ - [ActionsPrior.REQUEST_AUDIT_ACTION_FROM_FIELD, - ActionsPrior.REQUEST_COPY_FROM_FIELD]): - possible_states.append(FormState.AUDIT) form = safe_form_in_state(result_form, possible_states, form) diff --git a/tally_ho/apps/tally/views/clearance.py b/tally_ho/apps/tally/views/clearance.py index a86d18710..a11d45dcb 100644 --- a/tally_ho/apps/tally/views/clearance.py +++ b/tally_ho/apps/tally/views/clearance.py @@ -43,8 +43,7 @@ def clearance_action(post_data, clearance, result_form, url): if clearance.resolution_recommendation ==\ ClearanceResolution.PENDING_FIELD_INPUT: clearance.active = True - result_form.form_state = FormState.CLEARANCE - result_form.save() + clearance.reviewed_supervisor = False if clearance.resolution_recommendation ==\ ClearanceResolution.RESET_TO_PREINTAKE: @@ -312,12 +311,6 @@ def post(self, *args, **kwargs): self.request.user): possible_states.append(FormState.ARCHIVED) - if result_form.clearance is not None: - if (result_form.form_state == FormState.CLEARANCE) &\ - (result_form.clearance.resolution_recommendation ==\ - ClearanceResolution.PENDING_FIELD_INPUT): - possible_states.append(FormState.CLEARANCE) - form = safe_form_in_state(result_form, possible_states, form) if form: @@ -385,12 +378,6 @@ def post(self, *args, **kwargs): self.request.user): possible_states.append(FormState.ARCHIVED) - if result_form.clearance is not None: - if (result_form.form_state == FormState.CLEARANCE) &\ - (result_form.clearance.resolution_recommendation ==\ - ClearanceResolution.PENDING_FIELD_INPUT): - possible_states.append(FormState.CLEARANCE) - form = safe_form_in_state(result_form, possible_states, form) if form: From 17555eb4212fad3d72260672732772f9f5dd7e75 Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Thu, 14 Nov 2024 00:18:38 +0200 Subject: [PATCH 4/7] Fix tests --- tally_ho/apps/tally/tests/views/test_audit.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tally_ho/apps/tally/tests/views/test_audit.py b/tally_ho/apps/tally/tests/views/test_audit.py index b349debde..a63921d56 100644 --- a/tally_ho/apps/tally/tests/views/test_audit.py +++ b/tally_ho/apps/tally/tests/views/test_audit.py @@ -524,7 +524,7 @@ def test_review_post_supervisor_implement_de1(self): audit = Audit.objects.get(result_form=result_form) self.assertEqual(audit.supervisor, self.user) - self.assertTrue(audit.reviewed_supervisor) + self.assertFalse(audit.reviewed_supervisor) self.assertTrue(audit.reviewed_team) self.assertTrue(audit.active) self.assertEqual(audit.result_form.form_state, @@ -544,10 +544,10 @@ def test_review_post_supervisor_implement_de1(self): self.assertEqual(result_form_stat.result_form, result_form) for result in audit.result_form.results.all(): - self.assertFalse(result.active) + self.assertTrue(result.active) for result in audit.result_form.reconciliationform_set.all(): - self.assertFalse(result.active) + self.assertTrue(result.active) self.assertEqual(audit.action_prior_to_recommendation, ActionsPrior.REQUEST_AUDIT_ACTION_FROM_FIELD) From e69dc24090c388d93d8dd80e6cc0a4c53ecf8dac Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Thu, 14 Nov 2024 09:32:50 +0200 Subject: [PATCH 5/7] Update translations --- locale/ar/LC_MESSAGES/django.mo | Bin 59451 -> 60416 bytes locale/ar/LC_MESSAGES/django.po | 304 +++++++++++++++++++------------- 2 files changed, 185 insertions(+), 119 deletions(-) diff --git a/locale/ar/LC_MESSAGES/django.mo b/locale/ar/LC_MESSAGES/django.mo index 3117254ac8be9b093579ece4469a4d5e6611e2d8..e04c353d2668fdcf1b3755745bdd989eeb5cafe3 100644 GIT binary patch delta 15968 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 HfhqnECheF- delta 15725 zcmZwNcX$>>yT|c0goF}036MZYfY5u7p@iNey>}smq98TY2N0!73r#?JKtYOz-Vq_v z1mw`0Sik~`@={dL^ZjLR&g&m%uWR_sJu^EyZ8t%gcqQGwbLo7ya{4dyxGwm4UVhvj z;(4j*Jg<2fm3m%64bO|g{+Jb$F#@+^e!Pe|@OR9E{xv->6!RlpdDSo@#$gzCM70}^ z89dMD&2kxUAqG>i0<+_Gtc%AmH)g2ic?GZlDvrU-*b?(%S91imB%X}{cpKH@q6^*o>F6(&=Vf@loHPN*Aup+=fuf%-X0uZh_jW z{uWO~ot3rbVbt?()@A+mfL|!ciT?FGuPo-l3fK^}GKr|InTwj~63m9lR=)$aB4Z zK19tdOGCE>`BCN7QEy8-iw9W!R8;@IwPcEs*@v3Zx2PMQqdLsd$dyN+9vF=pP;)Eq ziE2L@HNe>zh|A2is0VFA-G3A#@siW$JtLzP2yN_^ya;MbYM}-Yhk8Ia)L|Wp`oN6G zw6lQPs$@)$htMC7;b1(88SvF6?m6|$7HP8o9moXIpcm?a{gH2kmxv{C7goVS%yk%y z8ek+A!SYxF+gZ5}HPhKx6&GVk{1VgQALa|x0A6X%;B=U>lF5kqF%uTWwD%f=h-;%} z-rV9I77s!V)Q8%#x#lWVKig3K?8D4>0<~2aQD^Aa=Dh!En68C;O|oJTaWGcKLZ}-% zSo!Oyr5=KM&l6EAG6yw)73LPyN*qKTwp1*HKcYTRL2<6WcpU4m8C0M^D^M5JpgC%! z30NK{V{uGD9j+Uw6}f{N;D1c-HCG;l>aQSbLM2cWt!m|UFe`C0ADL`qI-3JfOEU&F zklCn_Z$$0+8H<0%!ow3+AD=Y&nML=l_RR zaR}AHNz{X`VJ`g9%3q*f(=2V>9v4Clyb5ZsyQ7vi!Rkk%WC=zw(%9xE%GwFr;;*G{AT!2+@FY3OBs89EEOgj_p-O@*+CQ{ps!<@w3Q0<4H zPaRJuBiCULJcN4CdDPNAMJ@T?7>ofO+)Cxgg2bg!Z$)$T!&YWntVrAe2jUEzhfi<` zPV30}t01zI=e>(5I1XR!>>jWSHR4ocwY+Pnr7qXS4J;aU_+n85Z-LtD9;g8)U{M@` z+M30v{*qB!x4R4bugo0^%44RkZjWP7r?(}l;Dy7SF`�#x_J!&AI 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 diff --git a/locale/ar/LC_MESSAGES/django.po b/locale/ar/LC_MESSAGES/django.po index 4d13b0066..466fff622 100644 --- a/locale/ar/LC_MESSAGES/django.po +++ b/locale/ar/LC_MESSAGES/django.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Libya Tally\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-11 19:41+0200\n" +"POT-Creation-Date: 2024-11-14 09:27+0200\n" "PO-Revision-Date: 2014-02-21 16:33+0000\n" "Last-Translator: MonaHago \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/libya-tally/" @@ -679,51 +679,60 @@ msgid "Date Supervisor Modified:" msgstr "تاريخ تعديل المشرف:" #: tally_ho/apps/tally/templates/audit/print_cover.html:38 -#: tally_ho/apps/tally/templates/audit/review.html:36 #: tally_ho/apps/tally/templates/clearance/print_cover.html:50 -#: tally_ho/apps/tally/templates/clearance/review.html:16 +msgid "Modified by:" +msgstr "تعديل" + +#: tally_ho/apps/tally/templates/audit/print_cover.html:42 +#: tally_ho/apps/tally/templates/audit/review.html:32 +#: tally_ho/apps/tally/templates/audit/review.html:82 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:54 +#: tally_ho/apps/tally/templates/clearance/review.html:19 +#: tally_ho/apps/tally/templates/clearance/review.html:77 msgid "Problem" msgstr "مشكله " -#: tally_ho/apps/tally/templates/audit/print_cover.html:56 -#: tally_ho/apps/tally/templates/audit/review.html:42 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:68 -#: tally_ho/apps/tally/templates/clearance/review.html:32 +#: tally_ho/apps/tally/templates/audit/print_cover.html:60 +#: tally_ho/apps/tally/templates/audit/review.html:48 +#: tally_ho/apps/tally/templates/audit/review.html:88 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:72 +#: tally_ho/apps/tally/templates/clearance/review.html:44 +#: tally_ho/apps/tally/templates/clearance/review.html:93 msgid "Other:" msgstr "أخري" -#: tally_ho/apps/tally/templates/audit/print_cover.html:61 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:73 +#: tally_ho/apps/tally/templates/audit/print_cover.html:65 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:77 msgid "Action Conducted" msgstr "اجراء التصرف" -#: tally_ho/apps/tally/templates/audit/print_cover.html:67 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:79 +#: tally_ho/apps/tally/templates/audit/print_cover.html:71 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:83 msgid "Resolution Recommendation" msgstr "الحلول الموصى بها" -#: tally_ho/apps/tally/templates/audit/print_cover.html:71 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:83 +#: tally_ho/apps/tally/templates/audit/print_cover.html:75 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:87 msgid "Team Comment:" msgstr "تعليق الفريق:" -#: tally_ho/apps/tally/templates/audit/print_cover.html:74 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:86 +#: tally_ho/apps/tally/templates/audit/print_cover.html:78 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:90 msgid "Supervisor Comment:" msgstr "تعليق المشرف :" -#: tally_ho/apps/tally/templates/audit/print_cover.html:82 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:95 -#: tally_ho/apps/tally/templates/intake/print_cover.html:62 +#: tally_ho/apps/tally/templates/audit/print_cover.html:86 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:99 +#: tally_ho/apps/tally/templates/intake/print_cover.html:77 #: tally_ho/apps/tally/templates/quality_control/print_cover.html:52 msgid "Print" msgstr "طباعة" -#: tally_ho/apps/tally/templates/audit/print_cover.html:83 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:97 -#: tally_ho/apps/tally/templates/clearance/print_cover.html:99 -#: tally_ho/apps/tally/templates/intake/print_cover.html:64 -#: tally_ho/apps/tally/templates/intake/print_cover.html:66 +#: tally_ho/apps/tally/templates/audit/print_cover.html:87 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:101 +#: tally_ho/apps/tally/templates/clearance/print_cover.html:103 +#: tally_ho/apps/tally/templates/intake/print_cover.html:79 +#: tally_ho/apps/tally/templates/intake/print_cover.html:81 #: tally_ho/apps/tally/templates/quality_control/print_cover.html:53 msgid "Print Successful" msgstr "طباعه ناجحة وحفظ" @@ -750,24 +759,75 @@ msgstr "النموذج الموقوف" msgid "Failed quarantine check:" msgstr "فشل في فحص التوقيف" -#: tally_ho/apps/tally/templates/audit/review.html:37 -msgid "Blank reconciliation:" +#: tally_ho/apps/tally/templates/audit/review.html:35 +msgid "Blank reconciliation" msgstr "مصالحة غير متوفرة:" #: tally_ho/apps/tally/templates/audit/review.html:38 +msgid "Blank results" +msgstr "نتائج فارغة:" + +#: tally_ho/apps/tally/templates/audit/review.html:41 +msgid "Unclear figures" +msgstr "أشكال غير معروفة" + +#: tally_ho/apps/tally/templates/audit/review.html:44 +msgid "Damaged form" +msgstr "نموذج معطل:" + +#: tally_ho/apps/tally/templates/audit/review.html:53 +#: tally_ho/apps/tally/templates/audit/review.html:93 +#: tally_ho/apps/tally/templates/clearance/review.html:48 +#: tally_ho/apps/tally/templates/clearance/review.html:98 +msgid "Action Prior to Recommendation" +msgstr "الحلول الموصى بها" + +#: tally_ho/apps/tally/templates/audit/review.html:55 +#: tally_ho/apps/tally/templates/audit/review.html:94 +#: tally_ho/apps/tally/templates/clearance/review.html:50 +#: tally_ho/apps/tally/templates/clearance/review.html:99 +msgid "Action prior to recommendation:" +msgstr "الحلول الموصى بها" + +#: tally_ho/apps/tally/templates/audit/review.html:60 +#: tally_ho/apps/tally/templates/audit/review.html:97 +#: tally_ho/apps/tally/templates/clearance/review.html:55 +#: tally_ho/apps/tally/templates/clearance/review.html:102 +msgid "Resolution recommendation:" +msgstr "الحلول الموصى بها" + +#: tally_ho/apps/tally/templates/audit/review.html:68 +#: tally_ho/apps/tally/templates/audit/review.html:109 +#: tally_ho/apps/tally/templates/clearance/review.html:63 +#: tally_ho/apps/tally/templates/clearance/review.html:115 +msgid "Team comment:" +msgstr "تعليق الفريق" + +#: tally_ho/apps/tally/templates/audit/review.html:74 +#: tally_ho/apps/tally/templates/audit/review.html:114 +#: tally_ho/apps/tally/templates/clearance/review.html:69 +#: tally_ho/apps/tally/templates/clearance/review.html:120 +msgid "Supervisor comment:" +msgstr "تعليق المشرف" + +#: tally_ho/apps/tally/templates/audit/review.html:83 +msgid "Blank reconciliation:" +msgstr "مصالحة غير متوفرة:" + +#: tally_ho/apps/tally/templates/audit/review.html:84 msgid "Blank results:" msgstr "نتائج فارغة:" -#: tally_ho/apps/tally/templates/audit/review.html:39 +#: tally_ho/apps/tally/templates/audit/review.html:85 msgid "Unclear figures:" msgstr "أشكال غير معروفة" -#: tally_ho/apps/tally/templates/audit/review.html:40 +#: tally_ho/apps/tally/templates/audit/review.html:86 msgid "Damaged form:" msgstr "نموذج معطل:" -#: tally_ho/apps/tally/templates/audit/review.html:43 -#: tally_ho/apps/tally/templates/clearance/review.html:33 +#: tally_ho/apps/tally/templates/audit/review.html:90 +#: tally_ho/apps/tally/templates/clearance/review.html:95 #: tally_ho/apps/tally/templates/super_admin/edit_ballot.html:42 #: tally_ho/apps/tally/templates/super_admin/edit_center.html:41 #: tally_ho/apps/tally/templates/super_admin/edit_electrol_race.html:42 @@ -782,50 +842,46 @@ msgstr "نموذج معطل:" msgid "Save" msgstr "حفظ" -#: tally_ho/apps/tally/templates/audit/review.html:44 -#: tally_ho/apps/tally/templates/audit/review.html:60 -#: tally_ho/apps/tally/templates/clearance/review.html:34 -msgid "Action Prior to Recommendation" -msgstr "الحلول الموصى بها" - -#: tally_ho/apps/tally/templates/audit/review.html:45 -#: tally_ho/apps/tally/templates/audit/review.html:61 -#: tally_ho/apps/tally/templates/clearance/review.html:35 -msgid "Action prior to recommendation:" -msgstr "الحلول الموصى بها" - -#: tally_ho/apps/tally/templates/audit/review.html:48 -#: tally_ho/apps/tally/templates/audit/review.html:64 -#: tally_ho/apps/tally/templates/clearance/review.html:38 -msgid "Resolution recommendation:" -msgstr "الحلول الموصى بها" +#: tally_ho/apps/tally/templates/audit/review.html:91 +#: tally_ho/apps/tally/templates/check_clearance_center_details.html:16 +#: tally_ho/apps/tally/templates/clearance/review.html:96 +#: tally_ho/apps/tally/templates/corrections/required.html:70 +#: tally_ho/apps/tally/templates/quality_control/dashboard.html:24 +#: tally_ho/apps/tally/templates/super_admin/edit_ballot.html:45 +#: tally_ho/apps/tally/templates/super_admin/edit_center.html:44 +#: tally_ho/apps/tally/templates/super_admin/edit_electrol_race.html:45 +#: tally_ho/apps/tally/templates/super_admin/edit_result_form.html:39 +#: tally_ho/apps/tally/templates/super_admin/edit_station.html:52 +#: tally_ho/apps/tally/templates/super_admin/form.html:25 +#: tally_ho/apps/tally/templates/super_admin/quarantine_checks_config.html:51 +#: tally_ho/apps/tally/templates/super_admin/remove_center_confirmation.html:32 +#: tally_ho/apps/tally/templates/super_admin/remove_result_form_confirmation.html:50 +#: tally_ho/apps/tally/templates/super_admin/remove_station_confirmation.html:32 +#: tally_ho/apps/tally/templates/tally_manager/edit_user_profile.html:29 +#: tally_ho/apps/tally/templates/tally_manager/remove_user_confirmation.html:41 +#: tally_ho/apps/tally/templates/tally_manager/remove_user_confirmation.html:43 +#: tally_ho/apps/tally/templates/tally_manager/set_user_timeout.html:24 +#: tally_ho/apps/tally/templates/tally_manager/tally_files_form.html:86 +#: tally_ho/apps/tally/templates/tally_manager/tally_form.html:48 +#: tally_ho/apps/tally/templates/tally_manager/tally_form.html:58 +#: tally_ho/apps/tally/templates/tally_manager/tally_remove.html:36 +msgid "Cancel" +msgstr "تحقق" -#: tally_ho/apps/tally/templates/audit/review.html:52 -#: tally_ho/apps/tally/templates/clearance/review.html:42 +#: tally_ho/apps/tally/templates/audit/review.html:101 +#: tally_ho/apps/tally/templates/clearance/review.html:106 msgid "Forward to Supervisor and Print Cover" msgstr "تحيل إلى المشرف وطباعة الغلاف" -#: tally_ho/apps/tally/templates/audit/review.html:54 -#: tally_ho/apps/tally/templates/clearance/review.html:44 +#: tally_ho/apps/tally/templates/audit/review.html:103 +#: tally_ho/apps/tally/templates/clearance/review.html:108 msgid "Mark Form as Resolved" msgstr "تم تعديل النموذج" -#: tally_ho/apps/tally/templates/audit/review.html:55 +#: tally_ho/apps/tally/templates/audit/review.html:104 msgid "Return to Audit Team" msgstr "العودة إلى فريق التدقيق" -#: tally_ho/apps/tally/templates/audit/review.html:71 -#: tally_ho/apps/tally/templates/audit/review.html:75 -#: tally_ho/apps/tally/templates/clearance/review.html:51 -#: tally_ho/apps/tally/templates/clearance/review.html:55 -msgid "Team comment:" -msgstr "تعليق الفريق" - -#: tally_ho/apps/tally/templates/audit/review.html:80 -#: tally_ho/apps/tally/templates/clearance/review.html:60 -msgid "Supervisor comment:" -msgstr "تعليق المشرف" - #: tally_ho/apps/tally/templates/barcode_verify.html:9 msgid "Scan Barcode to proceed" msgstr "امسح الباركود للمتابعة" @@ -897,30 +953,6 @@ msgstr "الاسم غير مطابق والرقم غير صحيح - الرجاء msgid "Name Does Not Match and Code Correct - Send to Clearance" msgstr "الاسم غير مطابق والرقم صحيح- ارسل الاستمارة الى التصحيح" -#: tally_ho/apps/tally/templates/check_clearance_center_details.html:16 -#: tally_ho/apps/tally/templates/corrections/required.html:70 -#: tally_ho/apps/tally/templates/quality_control/dashboard.html:24 -#: tally_ho/apps/tally/templates/super_admin/edit_ballot.html:45 -#: tally_ho/apps/tally/templates/super_admin/edit_center.html:44 -#: tally_ho/apps/tally/templates/super_admin/edit_electrol_race.html:45 -#: tally_ho/apps/tally/templates/super_admin/edit_result_form.html:39 -#: tally_ho/apps/tally/templates/super_admin/edit_station.html:52 -#: tally_ho/apps/tally/templates/super_admin/form.html:25 -#: tally_ho/apps/tally/templates/super_admin/quarantine_checks_config.html:51 -#: tally_ho/apps/tally/templates/super_admin/remove_center_confirmation.html:32 -#: tally_ho/apps/tally/templates/super_admin/remove_result_form_confirmation.html:50 -#: tally_ho/apps/tally/templates/super_admin/remove_station_confirmation.html:32 -#: tally_ho/apps/tally/templates/tally_manager/edit_user_profile.html:29 -#: tally_ho/apps/tally/templates/tally_manager/remove_user_confirmation.html:41 -#: tally_ho/apps/tally/templates/tally_manager/remove_user_confirmation.html:43 -#: tally_ho/apps/tally/templates/tally_manager/set_user_timeout.html:24 -#: tally_ho/apps/tally/templates/tally_manager/tally_files_form.html:86 -#: tally_ho/apps/tally/templates/tally_manager/tally_form.html:48 -#: tally_ho/apps/tally/templates/tally_manager/tally_form.html:58 -#: tally_ho/apps/tally/templates/tally_manager/tally_remove.html:36 -msgid "Cancel" -msgstr "تحقق" - #: tally_ho/apps/tally/templates/clearance/dashboard.html:7 msgid "Clearance List" msgstr "قائمة التصحيح" @@ -950,35 +982,59 @@ msgstr "حالة التخليص: فريق الصفحة" msgid "None" msgstr "لا أحد" -#: tally_ho/apps/tally/templates/clearance/review.html:8 +#: tally_ho/apps/tally/templates/clearance/review.html:9 msgid "Clearance:" msgstr "التصحيح:" -#: tally_ho/apps/tally/templates/clearance/review.html:18 +#: tally_ho/apps/tally/templates/clearance/review.html:23 +msgid "Center name missing" +msgstr "اسم المركز مفقود" + +#: tally_ho/apps/tally/templates/clearance/review.html:26 +msgid "Center name mismatching" +msgstr "اسم المركز غير مطابق" + +#: tally_ho/apps/tally/templates/clearance/review.html:29 +msgid "Center code missing" +msgstr "رقم المركز مفقود" + +#: tally_ho/apps/tally/templates/clearance/review.html:32 +msgid "Center code mismatching" +msgstr "رقم المركز غير مطابق" + +#: tally_ho/apps/tally/templates/clearance/review.html:35 +msgid "Form already in system" +msgstr "رقم المركز موجود فى النظام مسبقاً" + +#: tally_ho/apps/tally/templates/clearance/review.html:40 +msgid "Form incorrectly entered into system" +msgstr "تم ادخال الاستمارة بشكل غير صحيح فى النظام" + +#: tally_ho/apps/tally/templates/clearance/review.html:79 msgid "Center name missing:" msgstr "اسم المركز مفقود" -#: tally_ho/apps/tally/templates/clearance/review.html:20 +#: tally_ho/apps/tally/templates/clearance/review.html:81 msgid "Center name mismatching:" msgstr "اسم المركز غير مطابق" -#: tally_ho/apps/tally/templates/clearance/review.html:22 +#: tally_ho/apps/tally/templates/clearance/review.html:83 msgid "Center code missing:" msgstr "رقم المركز مفقود" -#: tally_ho/apps/tally/templates/clearance/review.html:24 +#: tally_ho/apps/tally/templates/clearance/review.html:85 msgid "Center code mismatching:" msgstr "رقم المركز غير مطابق" -#: tally_ho/apps/tally/templates/clearance/review.html:26 +#: tally_ho/apps/tally/templates/clearance/review.html:87 msgid "Form already in system:" msgstr "رقم المركز موجود فى النظام مسبقاً" -#: tally_ho/apps/tally/templates/clearance/review.html:30 +#: tally_ho/apps/tally/templates/clearance/review.html:91 msgid "Form incorrectly entered into system:" msgstr "تم ادخال الاستمارة بشكل غير صحيح فى النظام" -#: tally_ho/apps/tally/templates/clearance/review.html:46 +#: tally_ho/apps/tally/templates/clearance/review.html:110 msgid "Return to Clearance Team" msgstr "رجوع الى فريق التصحيح" @@ -1130,10 +1186,10 @@ msgstr "معرف" #: tally_ho/apps/tally/templates/data/sub_cons_list.html:36 #: tally_ho/apps/tally/templates/data/tallies.html:32 #: tally_ho/apps/tally/templates/data/users.html:56 -#: tally_ho/apps/tally/templates/intake/print_cover.html:34 -#: tally_ho/apps/tally/templates/intake/print_cover.html:39 -#: tally_ho/apps/tally/templates/intake/print_cover.html:45 -#: tally_ho/apps/tally/templates/intake/print_cover.html:50 +#: tally_ho/apps/tally/templates/intake/print_cover.html:49 +#: tally_ho/apps/tally/templates/intake/print_cover.html:54 +#: tally_ho/apps/tally/templates/intake/print_cover.html:60 +#: tally_ho/apps/tally/templates/intake/print_cover.html:65 #: tally_ho/apps/tally/templates/reports/admin_areas_excluded_after_investigation.html:39 #: tally_ho/apps/tally/templates/reports/admin_areas_under_investigation.html:39 #: tally_ho/apps/tally/templates/reports/corrections_statistics.html:11 @@ -1292,13 +1348,13 @@ msgstr "غير مدخلة" #: tally_ho/apps/tally/views/intake.py:211 #: tally_ho/apps/tally/views/intake.py:238 #: tally_ho/apps/tally/views/intake.py:275 -#: tally_ho/apps/tally/views/intake.py:421 +#: tally_ho/apps/tally/views/intake.py:422 #: tally_ho/libs/reports/progress.py:185 msgid "Intake" msgstr "استقبال" #: tally_ho/apps/tally/templates/data/forms.html:31 -#: tally_ho/apps/tally/views/intake.py:422 +#: tally_ho/apps/tally/views/intake.py:423 #: tally_ho/libs/reports/progress.py:205 msgid "Data Entry 1" msgstr "ادخال بيانات 1" @@ -1325,7 +1381,7 @@ msgstr "ضبط الجودة" #: tally_ho/apps/tally/templates/data/forms.html:36 #: tally_ho/apps/tally/templates/super_admin/form_progress_by_form_state.html:35 -#: tally_ho/apps/tally/views/clearance.py:337 +#: tally_ho/apps/tally/views/clearance.py:343 #: tally_ho/libs/reports/progress.py:195 msgid "Clearance" msgstr "تحقق" @@ -1776,38 +1832,52 @@ msgid "Successful" msgstr "نجاح" #: tally_ho/apps/tally/templates/intake/print_cover.html:19 -msgid "Data Entry One:" -msgstr "ادخال البيانات الاول :" +#: tally_ho/apps/tally/templates/quality_control/print_cover.html:36 +msgid "Date/Time:" +msgstr "التاريخ / الوقت" + +#: tally_ho/apps/tally/templates/intake/print_cover.html:23 +msgid "Intaken by:" +msgstr "استقبال" -#: tally_ho/apps/tally/templates/intake/print_cover.html:20 #: tally_ho/apps/tally/templates/intake/print_cover.html:27 +msgid "Intake Clerk:" +msgstr "موظف الاستقبال " + +#: tally_ho/apps/tally/templates/intake/print_cover.html:28 +#: tally_ho/apps/tally/templates/intake/print_cover.html:35 +#: tally_ho/apps/tally/templates/intake/print_cover.html:42 #: tally_ho/apps/tally/templates/super_admin/quarantine_checks_config.html:25 #: tally_ho/apps/tally/templates/super_admin/remove_center_confirmation.html:24 msgid "Name:" msgstr "الاسم :" -#: tally_ho/apps/tally/templates/intake/print_cover.html:26 +#: tally_ho/apps/tally/templates/intake/print_cover.html:34 +msgid "Data Entry One:" +msgstr "ادخال البيانات الاول :" + +#: tally_ho/apps/tally/templates/intake/print_cover.html:41 msgid "Data Entry Two:" msgstr "ادخال البيانات التاني :" -#: tally_ho/apps/tally/templates/intake/print_cover.html:33 +#: tally_ho/apps/tally/templates/intake/print_cover.html:48 msgid "Corrections:" msgstr "التصحيح :" -#: tally_ho/apps/tally/templates/intake/print_cover.html:34 +#: tally_ho/apps/tally/templates/intake/print_cover.html:49 msgid "To Quality Control" msgstr "الى ضبط الجودة" -#: tally_ho/apps/tally/templates/intake/print_cover.html:39 -#: tally_ho/apps/tally/templates/intake/print_cover.html:50 +#: tally_ho/apps/tally/templates/intake/print_cover.html:54 +#: tally_ho/apps/tally/templates/intake/print_cover.html:65 msgid "To Data Entry One" msgstr "الى ادخال بيانات 1" -#: tally_ho/apps/tally/templates/intake/print_cover.html:44 +#: tally_ho/apps/tally/templates/intake/print_cover.html:59 msgid "Quality Control:" msgstr "ضبط الجودة :" -#: tally_ho/apps/tally/templates/intake/print_cover.html:45 +#: tally_ho/apps/tally/templates/intake/print_cover.html:60 msgid "To Archive" msgstr "الى الارشيف" @@ -1869,10 +1939,6 @@ msgstr "تمت الارشفه بنجاح " msgid "Archived Form" msgstr "نموذج مؤرشف" -#: tally_ho/apps/tally/templates/quality_control/print_cover.html:36 -msgid "Date/Time:" -msgstr "التاريخ / الوقت" - #: tally_ho/apps/tally/templates/quality_control/print_cover.html:41 msgid "Quarantined by:" msgstr "تم توقيفه من" @@ -3144,12 +3210,12 @@ msgid "" "related to it" msgstr "هل أنت متأكد أنك تريد حذف هذا العدد؟ سيحذف جميع البيانات المتعلقة به" -#: tally_ho/apps/tally/views/audit.py:343 +#: tally_ho/apps/tally/views/audit.py:344 msgid "Create Audit" msgstr "أنشاء التدقيق" -#: tally_ho/apps/tally/views/clearance.py:272 -#: tally_ho/apps/tally/views/clearance.py:387 +#: tally_ho/apps/tally/views/clearance.py:278 +#: tally_ho/apps/tally/views/clearance.py:393 msgid "Create Clearance" msgstr "تحقق" From 66f9442413d4055c58a8739e9343341948861ea4 Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Thu, 14 Nov 2024 12:19:07 +0200 Subject: [PATCH 6/7] Fix importing staff list command and add an option tally id --- .../management/commands/import_staff_list.py | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/tally_ho/apps/tally/management/commands/import_staff_list.py b/tally_ho/apps/tally/management/commands/import_staff_list.py index 0e392f7b0..3d2850111 100644 --- a/tally_ho/apps/tally/management/commands/import_staff_list.py +++ b/tally_ho/apps/tally/management/commands/import_staff_list.py @@ -5,6 +5,7 @@ from django.core.management.base import BaseCommand from django.utils.translation import gettext_lazy +from tally_ho.apps.tally.models.tally import Tally from tally_ho.libs.permissions import groups from tally_ho.apps.tally.models.user_profile import UserProfile @@ -41,12 +42,9 @@ def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs): - # csv.py doesn't do Unicode; encode temporarily as UTF-8: - csv_reader = csv.reader(utf_8_encoder(unicode_csv_data), - dialect=dialect, **kwargs) + csv_reader = csv.reader(unicode_csv_data, dialect=dialect, **kwargs) for row in csv_reader: - # decode UTF-8 back to Unicode, cell by cell: - yield [str(cell, 'utf-8') for cell in row] + yield row def utf_8_encoder(unicode_csv_data): @@ -54,10 +52,22 @@ def utf_8_encoder(unicode_csv_data): yield line.encode('utf-8') -def add_row(command, name, username, role, admin=None): +def add_row(command, name, username, role, admin=None, tally_id=None): try: + # Parse the name into first and last name first_name, last_name = assign_names(name) - user = create_user(first_name, last_name, username) + + tally = None + if tally_id: + try: + tally = Tally.objects.get(id=tally_id) + except Tally.DoesNotExist: + command.stdout.write(command.style.ERROR( + f"Tally with id '{tally_id}' does not exist." + )) + return # Exit function if the Tally is not found + + user = create_user(first_name, last_name, username, tally) permission = True if admin == 'Yes' else False user.is_superuser = user.is_staff = permission @@ -65,18 +75,18 @@ def add_row(command, name, username, role, admin=None): except Exception as e: command.stdout.write(command.style.ERROR( - "User '%s' not created! '%s'" % (username, e))) + f"User '{username}' not created! '{e}'" + )) else: system_role = STAFF_ROLE_DICT.get(role.upper().strip()) if system_role: - group = Group.objects.get_or_create( - name=system_role)[0] + group = Group.objects.get_or_create(name=system_role)[0] user.groups.add(group) else: command.stdout.write(command.style.ERROR( - "Unable to add user %s to unknown group '%s'." - % (username, role))) + f"Unable to add user {username} to unknown group '{role}'." + )) def assign_names(name): @@ -91,14 +101,20 @@ def assign_names(name): return first_name, last_name -def create_user(first_name, last_name, username): +def create_user(first_name, last_name, username, tally=None): try: return UserProfile.objects.get(username=username) except UserProfile.DoesNotExist: - return UserProfile.objects.create_user( - username, password=username, + user = UserProfile.objects.create_user( + username=username, + password=username, first_name=first_name, - last_name=last_name) + last_name=last_name + ) + if tally: + user.tally = tally + user.save() + return user class Command(BaseCommand): @@ -106,7 +122,6 @@ class Command(BaseCommand): def handle(self, *args, **kwargs): self.import_staff_list() - self.import_user_list() def import_staff_list(self): with codecs.open(STAFF_LIST_PATH, encoding='utf-8') as f: @@ -116,12 +131,15 @@ def import_staff_list(self): for row in reader: try: name, username, role, admin = row[0:4] + tally_id =\ + row[4].strip()\ + if len(row) > 4 and row[4].strip() else None except Exception as e: self.stdout.write(self.style.ERROR( - 'Unable to add user in row: %s. Exception %s.' % - (row, e))) + f'Unable to add user in row: {row}. Exception: {e}.' + )) else: - add_row(self, name, username, role, admin) + add_row(self, name, username, role, admin, tally_id) def import_user_list(self): with codecs.open(USER_LIST_PATH, encoding='utf-8') as f: From 9139e6beb0bf32ec0d475464b443a54aaac577ee Mon Sep 17 00:00:00 2001 From: JOHNMWASHUMA Date: Thu, 14 Nov 2024 14:09:46 +0200 Subject: [PATCH 7/7] Remove total of field 5 and 7 from form to be handled by quarantine trigger --- tally_ho/apps/tally/forms/recon_form.py | 22 ------------------- .../apps/tally/tests/forms/test_recon_form.py | 17 -------------- 2 files changed, 39 deletions(-) diff --git a/tally_ho/apps/tally/forms/recon_form.py b/tally_ho/apps/tally/forms/recon_form.py index 6ce23cc9b..b1df999bd 100644 --- a/tally_ho/apps/tally/forms/recon_form.py +++ b/tally_ho/apps/tally/forms/recon_form.py @@ -1,7 +1,5 @@ -from django import forms from django.forms import ModelForm from tally_ho.apps.tally.models import ReconciliationForm -from django.utils.translation import gettext_lazy as _ disable_copy_input = { @@ -54,23 +52,3 @@ def __init__(self, *args, **kwargs): class_str, self.fields[field].widget.attrs.get('class')) self.fields[field].widget.attrs['class'] = class_str - def clean(self): - """Verify that the total of field number_cancelled_ballots and - field number_ballots_inside_box match the value of field - total_of_cancelled_ballots_and_ballots_inside_box - """ - if self.is_valid(): - cleaned_data = super(ReconForm, self).clean() - number_cancelled_ballots =\ - cleaned_data.get('number_cancelled_ballots') - number_ballots_inside_box =\ - cleaned_data.get('number_ballots_inside_box') - total_of_cancelled_ballots_and_ballots_inside_box =\ - cleaned_data.get( - 'total_of_cancelled_ballots_and_ballots_inside_box') - - if (number_cancelled_ballots + number_ballots_inside_box) !=\ - total_of_cancelled_ballots_and_ballots_inside_box: - raise forms.ValidationError( - _('Total of fied 5 and 7 is incorrect')) - return cleaned_data diff --git a/tally_ho/apps/tally/tests/forms/test_recon_form.py b/tally_ho/apps/tally/tests/forms/test_recon_form.py index 36e0a2bc3..c31a96ace 100644 --- a/tally_ho/apps/tally/tests/forms/test_recon_form.py +++ b/tally_ho/apps/tally/tests/forms/test_recon_form.py @@ -1,7 +1,6 @@ from tally_ho.libs.tests.test_base import TestBase, create_result_form from tally_ho.libs.permissions import groups from tally_ho.apps.tally.forms.recon_form import ReconForm -from django.utils.translation import gettext_lazy as _ class ReconFormTest(TestBase): def setUp(self): @@ -47,22 +46,6 @@ def test_missing_required_fields(self): self.assertFalse(form.is_valid()) self.assertIn('number_valid_votes', form.errors) - def test_custom_clean_validation(self): - """Test that custom validation in clean method raises error with - incorrect totals.""" - invalid_data = self.valid_data.copy() - invalid_data['total_of_cancelled_ballots_and_ballots_inside_box'] =\ - 999 # Invalid total - form = ReconForm(data=invalid_data) - self.assertFalse(form.is_valid()) - - # Convert the error messages to strings for comparison - error_messages = [str(err) for err in form.errors['__all__']] - - # Check if the expected error message is in the error messages - self.assertIn( - str(_('Total of fied 5 and 7 is incorrect')), error_messages) - def test_disable_copy_paste_attributes(self): """Test that the copy/paste attributes are disabled on all form fields."""