From 50388ca4deeaefbaf85ebd30724f3dd2d4830b8c Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Tue, 18 Jul 2017 18:32:23 +0530 Subject: [PATCH 01/11] denomination ui updates --- .../network_detail/denomination.html | 224 ++++++++++-------- .../dashboard/network_detail/header.html | 5 + cloud/endagaweb/views/django_tables.py | 13 +- cloud/endagaweb/views/network.py | 10 +- 4 files changed, 144 insertions(+), 108 deletions(-) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index 3e7582f0..e87b6b7a 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -37,85 +37,42 @@ {% endblock %} {% block content %} - {% include "dashboard/network_detail/header.html" with network=network %} + {% include "dashboard/network_detail/header.html" with network=network active_tab='network-denominations' %}
{% include "dashboard/network_detail/nav.html" with active_tab='network-denominations' %} -
+
{% for message in messages %}
× {{ message }}
{% endfor %} +
{% if denomination %} {% render_table denominations_table %} + {% if user_profile.user.is_staff %} + + {% endif %} {% else %}

There are currently no denominations associated with this network.

{% endif %}
+
- {% if user_profile.user.is_staff %} -
-
-
Create Denomination
-
-
-
{% csrf_token %} -
-
- -
- -
-
-
- -
-
- -
- -
-
-
- -
-
- -
- -
-
-
- -
-
-
- - - -
-
-
-
-
-
-
-
- {% endif %}
@@ -132,17 +89,77 @@
+ {% endblock %} {% block js %} @@ -151,6 +168,20 @@

src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.10.0/jquery.validate.min.js"> diff --git a/cloud/endagaweb/views/network.py b/cloud/endagaweb/views/network.py index 18a06b75..2ff2bd0f 100644 --- a/cloud/endagaweb/views/network.py +++ b/cloud/endagaweb/views/network.py @@ -446,6 +446,8 @@ def get(self, request, network_id): user_profile = models.UserProfile.objects.get(user=request.user) try: network = models.Network.objects.get(pk=network_id) + if 'sync_status' in request.session: + del request.session['sync_status'] except models.Network.DoesNotExist: return http.HttpResponseBadRequest() @@ -466,8 +468,16 @@ def get(self, request): network = user_profile.network currency = network.subscriber_currency + sync_status = False + if 'sync_status' in request.session: + sync_status = request.session['sync_status'] + else: + self.sync_denomination(network.id, 'discard') + request.session['sync_status'] = sync_status + # Count the associated denomination with selected network. - denom = models.NetworkDenomination.objects.filter(network=network) + denom = models.NetworkDenomination.objects.filter( + network=network, status__in=['done', 'pending']) denom_count = denom.count() dnm_id = request.GET.get('id', None) @@ -492,20 +502,17 @@ def get(self, request): invalid_ranges = [] max_denominations = 0 - merge = request.GET.get('merge', None) + denom_delta = 1000 for denomination in denom: - if denomination.start_amount > (max_denominations+1000): + if denomination.start_amount > (max_denominations+denom_delta): start_range = humanize_credits(max_denominations, CURRENCIES[currency]).amount end_range = humanize_credits(denomination.start_amount, CURRENCIES[currency]).amount - if merge: - denomination.start_amount = max_denominations+1000 - denomination.save() - else: - invalid_ranges.append({"start": start_range, - "end": end_range}) + invalid_ranges.append({"start": start_range, "end": end_range}) max_denominations = denomination.end_amount + next_start_amount = humanize_credits(max_denominations+denom_delta, + CURRENCIES[currency]).amount # Configure the table of denominations. Do not show any pagination # controls if the total number of donominations is small. @@ -529,7 +536,9 @@ def get(self, request): 'number_country': NUMBER_COUNTRIES[network.number_country], 'denomination': denom_count, 'denominations_table': denom_table, - 'invalid_ranges': invalid_ranges + 'invalid_ranges': invalid_ranges, + 'next_start_amount': next_start_amount, + 'sync_status': sync_status } # Render template. info_template = template.loader.get_template( @@ -546,6 +555,16 @@ def post(self, request): user_profile = models.UserProfile.objects.get(user=request.user) network = user_profile.network try: + sync = request.GET.get('sync', False) + if sync: + self.sync_denomination(network.id, 'apply') + request.session['sync_status'] = False + messages.success( + request, 'New denomination changes applied successfully.', + extra_tags='alert alert-success') + return http.HttpResponse(json.dumps({'status': 'ok'}), + content_type="application/json") + currency = network.subscriber_currency start_amount_raw = request.POST.get('start_amount') start_amount = parse_credits(start_amount_raw, @@ -585,13 +604,14 @@ def post(self, request): if dnm_id > 0: try: denom = models.NetworkDenomination.objects.get( - id=dnm_id) + id=dnm_id, status__in=['done', 'pending']) # Check for existing denomination range exist. denom_exists = \ models.NetworkDenomination.objects.filter( end_amount__gte=start_amount, start_amount__lte=end_amount, - network=user_profile.network).exclude( + network=user_profile.network, + status__in=['done', 'pending']).exclude( id=dnm_id).count() if denom_exists: messages.error( @@ -599,11 +619,18 @@ def post(self, request): extra_tags='alert alert-danger') return redirect( urlresolvers.reverse('network-denominations')) - denom.network = user_profile.network - denom.start_amount = start_amount - denom.end_amount = end_amount - denom.validity_days = validity_days + denom.status = 'deleted' denom.save() + # Create new denomination for updated record + new_denom = models.NetworkDenomination( + network=user_profile.network) + new_denom.network = user_profile.network + new_denom.start_amount = start_amount + new_denom.end_amount = end_amount + new_denom.validity_days = validity_days + new_denom.status = 'pending' + new_denom.save() + request.session['sync_status'] = True messages.success( request, 'Denomination is updated successfully.', extra_tags='alert alert-success') @@ -618,7 +645,8 @@ def post(self, request): denom_exists = models.NetworkDenomination.objects.filter( end_amount__gte=start_amount, start_amount__lte=end_amount, - network=user_profile.network).count() + network=user_profile.network, + status__in=['done', 'pending']).count() if denom_exists: messages.error( request, 'Denomination range already exists.', @@ -632,7 +660,9 @@ def post(self, request): denom.start_amount = start_amount denom.end_amount = end_amount denom.validity_days = validity_days + denom.status = 'pending' denom.save() + request.session['sync_status'] = True messages.success( request, 'Denomination is created successfully.', extra_tags='alert alert-success') @@ -644,7 +674,8 @@ def post(self, request): return redirect(urlresolvers.reverse('network-denominations')) def delete(self, request): - """Handles delete requests.""" + """soft delete denominations, this can be commit/rollback by + sync_denomination() as per request.""" response = { 'status': 'ok', 'messages': [], @@ -652,22 +683,42 @@ def delete(self, request): dnm_ids = request.GET.getlist('ids[]') or False if dnm_ids: try: - denom = models.NetworkDenomination.objects.filter( - id__in=dnm_ids) - for denomination in denom: - denomination.delete() + models.NetworkDenomination.objects.filter( + id__in=dnm_ids).update(status='deleted') + request.session['sync_status'] = True response['status'] = 'success' messages.success(request, 'Denomination deleted successfully.', extra_tags='alert alert-success') except models.NetworkDenomination.DoesNotExist: response['status'] = 'failed' - messages.error( - request, 'Invalid denomination ID.', + messages.error( request, 'Invalid denomination ID.', extra_tags='alert alert-danger') else: response['status'] = 'failed' - messages.error( - request, 'Invalid request data.', + messages.error(request, 'Invalid request data.', extra_tags='alert alert-danger') return http.HttpResponse(json.dumps(response), content_type="application/json") + + def sync_denomination(self, network_id, status): + """ Rebase denomination table remove pending changes. """ + if status == 'apply': + with transaction.atomic(): + models.NetworkDenomination.objects.filter( + network=network_id, + status__in=['pending']).update(status='done') + deleted_denom = models.NetworkDenomination.objects.filter( + status__in=['deleted']) + for denomination in deleted_denom: + denomination.delete() + if status == 'discard': + with transaction.atomic(): + new_denom = models.NetworkDenomination.objects.filter( + status__in=['pending']) + for denomination in new_denom: + denomination.delete() + deleted_denom = models.NetworkDenomination.objects.filter( + status__in=['deleted']) + for denomination in deleted_denom: + denomination.status = 'done' + denomination.save() From b11ccf6b52824cb99bcc669346b7ca20159d19dc Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Mon, 24 Jul 2017 21:19:25 +0530 Subject: [PATCH 05/11] denomination help text --- .../templates/dashboard/network_detail/denomination.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index 5812faad..1f344d58 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -82,6 +82,10 @@

Warning! Changes are not saved yet. Please confirm to subm {% else %}

There are currently no denominations associated with this network.

{% endif %} +

"Denomination" facilitates admin to create various top-up brackets along with limited validity period + which can be achieved using “Add Denomination” Button. "Add denomination" button is used to create various denomination brackets and their validity period for Recharges. + For error free creation of denomination brackets, Created denomination bracket must be continuous in terms of Amount. + ( Ex:- Start Amount for 1st denomination is 0.01 & End Amount is 10 , for 2nd Denomination Start Amount must start from 10.01)

From 177eff45f5ccab02f6d5c3ebcf3bba80beb60159 Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Tue, 25 Jul 2017 12:19:19 +0530 Subject: [PATCH 06/11] messages --- .../dashboard/network_detail/denomination.html | 12 +++++++++--- cloud/endagaweb/views/network.py | 7 ++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index 1f344d58..f81b1324 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -46,13 +46,19 @@ {% if invalid_ranges and user_profile.user.is_staff %}
× -

Warning! There is {{ invalid_ranges | length }} gap in defined denomination ranges.

+

+ + Error! There is a gap in denomination brackets. Add/edit denominations to fill the below gaps. Changes are not saved yet until you confirm the final submit. +

Gap are {% for range in invalid_ranges %}{{ range.start }} - {{ range.end }} {% endfor %}

{% elif sync_status and user_profile.user.is_staff %}
-

Warning! Changes are not saved yet. Please confirm to submit changes. - Submit Changes

+

+ + Warning! Changes are not saved yet. Please confirm to submit changes. + Submit Changes +

{% endif %} {% for message in messages %} diff --git a/cloud/endagaweb/views/network.py b/cloud/endagaweb/views/network.py index 2ff2bd0f..38024242 100644 --- a/cloud/endagaweb/views/network.py +++ b/cloud/endagaweb/views/network.py @@ -505,11 +505,12 @@ def get(self, request): denom_delta = 1000 for denomination in denom: if denomination.start_amount > (max_denominations+denom_delta): - start_range = humanize_credits(max_denominations, + start_range = humanize_credits((max_denominations+denom_delta), CURRENCIES[currency]).amount - end_range = humanize_credits(denomination.start_amount, + end_range = humanize_credits((denomination.start_amount-denom_delta), CURRENCIES[currency]).amount - invalid_ranges.append({"start": start_range, "end": end_range}) + invalid_ranges.append({"start": start_range, + "end": end_range}) max_denominations = denomination.end_amount next_start_amount = humanize_credits(max_denominations+denom_delta, CURRENCIES[currency]).amount From 3d4c7d0bfb7440e97db43c5d65f3d1dc32ec0c75 Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Tue, 25 Jul 2017 13:00:03 +0530 Subject: [PATCH 07/11] message change --- .../templates/dashboard/network_detail/denomination.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index f81b1324..6169d2d8 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -48,7 +48,7 @@ ×

- Error! There is a gap in denomination brackets. Add/edit denominations to fill the below gaps. Changes are not saved yet until you confirm the final submit. + Error! There is a gap in denomination brackets. Add/edit denominations to fill the below gaps. Changes will be lost until you confirm the final submit.

Gap are {% for range in invalid_ranges %}{{ range.start }} - {{ range.end }} {% endfor %}

@@ -62,10 +62,10 @@

{% endif %} {% for message in messages %} -
+ {% endfor %}
From fd2fc1571f7eaf1ff6ee4515959d082398a86293 Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Tue, 25 Jul 2017 17:22:18 +0530 Subject: [PATCH 08/11] error/success message rolback --- .../templates/dashboard/network_detail/denomination.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index 6169d2d8..bb7d7f19 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -62,10 +62,10 @@

{% endif %} {% for message in messages %} - +
{% endfor %}
From c4284b638577693ae22c61fc1470578d7c56b473 Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Wed, 26 Jul 2017 18:44:57 +0530 Subject: [PATCH 09/11] display text change --- .../templates/dashboard/network_detail/denomination.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index bb7d7f19..80a7d101 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -48,9 +48,9 @@ ×

- Error! There is a gap in denomination brackets. Add/edit denominations to fill the below gaps. Changes will be lost until you confirm the final submit. + Error! There is a missing range in denomination brackets. Add/edit denominations to fill the below missing ranges. Changes will be lost until you confirm the final submit.

-

Gap are {% for range in invalid_ranges %}{{ range.start }} - {{ range.end }} {% endfor %}

+

Missing range are {% for range in invalid_ranges %}{{ range.start }} - {{ range.end }} {% endfor %}

{% elif sync_status and user_profile.user.is_staff %}
From fa9e8c583c41565b62646f9e32c796d1becc9eae Mon Sep 17 00:00:00 2001 From: Shiv K Sah Date: Fri, 28 Jul 2017 14:14:50 +0530 Subject: [PATCH 10/11] denomination start/end amount make integer --- cloud/endagaweb/models.py | 1 + .../network_detail/denomination.html | 56 ++----------- cloud/endagaweb/urls.py | 3 + cloud/endagaweb/views/network.py | 80 +++++++++++-------- 4 files changed, 56 insertions(+), 84 deletions(-) diff --git a/cloud/endagaweb/models.py b/cloud/endagaweb/models.py index 414eb825..8b4679b0 100644 --- a/cloud/endagaweb/models.py +++ b/cloud/endagaweb/models.py @@ -1486,6 +1486,7 @@ def __unicode__(self): class Meta: ordering = ('start_amount',) + default_permissions = () class ConfigurationKey(models.Model): diff --git a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html index 80a7d101..e99036a2 100644 --- a/cloud/endagaweb/templates/dashboard/network_detail/denomination.html +++ b/cloud/endagaweb/templates/dashboard/network_detail/denomination.html @@ -158,7 +158,7 @@
- {% csrf_token %} {% endfor %} - +
{% if denomination %} {% render_table denominations_table %} @@ -91,7 +91,7 @@

"Denomination" facilitates admin to create various top-up brackets along with limited validity period which can be achieved using “Add Denomination” Button. "Add denomination" button is used to create various denomination brackets and their validity period for Recharges. For error free creation of denomination brackets, Created denomination bracket must be continuous in terms of Amount. - ( Ex:- Start Amount for 1st denomination is 0.01 & End Amount is 10 , for 2nd Denomination Start Amount must start from 10.01)

+ ( Ex:- Start Amount for 1st denomination is 1 & End Amount is 10 , for 2nd Denomination Start Amount must start from 11)

@@ -231,7 +231,7 @@

"{{ network.name }}" {% endif %} {% if user_profile.user.is_staff %} - {% if active_tab == 'network-denominations' %} + {% if active_tab == 'network-denominations' %} Add Denomination - {% endif %} + {% endif %} {% endif %}

diff --git a/cloud/endagaweb/views/network.py b/cloud/endagaweb/views/network.py index 16df4a15..d4fab672 100644 --- a/cloud/endagaweb/views/network.py +++ b/cloud/endagaweb/views/network.py @@ -526,10 +526,9 @@ def get(self, request): content_type="application/json") invalid_ranges = [] - max_denominations = 0 - denom_delta = 1000 + max_denominations = 100000 for denomination in denom: - if denomination.start_amount > (max_denominations+denom_delta): + if denomination.start_amount > (max_denominations): start_range = humanize_credits((max_denominations), CURRENCIES[currency]).money_str() end_range = humanize_credits((denomination.start_amount), @@ -605,9 +604,6 @@ def post(self, request): CURRENCIES[currency]).amount_raw validity_days = int(request.POST.get('validity_days')) or 0 - print "start_amount_raw = ", start_amount_raw - print "start_amount = ", start_amount - dnm_id = int(request.POST.get('dnm_id')) or 0 if validity_days > settings.ENDAGA['MAX_VALIDITY_DAYS']: message = ('Validity days value exceeds maximum permissible ' @@ -617,9 +613,9 @@ def post(self, request): request, message, extra_tags='alert alert-danger') return redirect(urlresolvers.reverse('network-denominations')) - elif start_amount < 0 or end_amount <= 0: + elif start_amount < 1 or end_amount <= 1: messages.error(request, - 'Enter value >0 for start/end amount.', + 'Enter value >= 1 for start amount.', extra_tags='alert alert-danger') return redirect(urlresolvers.reverse('network-denominations')) elif validity_days <= 0: