From d1eaaa25bd1bfb07e9b55ee3d5d81bafbb58a9db Mon Sep 17 00:00:00 2001 From: mahdavi Date: Sun, 14 Jul 2024 15:37:47 +0330 Subject: [PATCH] payment actions --- apps/core/__init__.py | 0 apps/core/admin.py | 2 + apps/core/apps.py | 6 +++ apps/core/migrations/__init__.py | 0 apps/core/models.py | 2 + .../templates/jalali_date/widgets/attrs.html | 1 + .../templates/jalali_date/widgets/date.html | 1 + apps/core/templatetags/__init__.py | 0 apps/core/templatetags/tags.py | 30 +++++++++++ apps/core/tests.py | 3 ++ apps/core/urls.py | 7 +++ apps/core/utils/__init__.py | 0 apps/core/utils/jalali_date.py | 51 +++++++++++++++++++ apps/core/views.py | 10 ++++ apps/users/views.py | 9 ++-- apps/wallet/views.py | 5 ++ templates/core/home.html | 12 +++++ templates/include/top_bar.html | 4 ++ templates/wallet/transaction_detail.html | 6 ++- wallet/urls.py | 1 + 20 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 apps/core/__init__.py create mode 100644 apps/core/admin.py create mode 100644 apps/core/apps.py create mode 100644 apps/core/migrations/__init__.py create mode 100644 apps/core/models.py create mode 100644 apps/core/templates/jalali_date/widgets/attrs.html create mode 100644 apps/core/templates/jalali_date/widgets/date.html create mode 100644 apps/core/templatetags/__init__.py create mode 100644 apps/core/templatetags/tags.py create mode 100644 apps/core/tests.py create mode 100644 apps/core/urls.py create mode 100644 apps/core/utils/__init__.py create mode 100644 apps/core/utils/jalali_date.py create mode 100644 apps/core/views.py create mode 100644 templates/core/home.html diff --git a/apps/core/__init__.py b/apps/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/core/admin.py b/apps/core/admin.py new file mode 100644 index 0000000..c6fe108 --- /dev/null +++ b/apps/core/admin.py @@ -0,0 +1,2 @@ +from django.contrib import admin + diff --git a/apps/core/apps.py b/apps/core/apps.py new file mode 100644 index 0000000..4143768 --- /dev/null +++ b/apps/core/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CoreConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.core' diff --git a/apps/core/migrations/__init__.py b/apps/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/core/models.py b/apps/core/models.py new file mode 100644 index 0000000..56987d4 --- /dev/null +++ b/apps/core/models.py @@ -0,0 +1,2 @@ +from django.db import models +from django.utils.translation import gettext_lazy as _ diff --git a/apps/core/templates/jalali_date/widgets/attrs.html b/apps/core/templates/jalali_date/widgets/attrs.html new file mode 100644 index 0000000..7a5592a --- /dev/null +++ b/apps/core/templates/jalali_date/widgets/attrs.html @@ -0,0 +1 @@ +{% for name, value in widget.attrs.items %}{% if value is not False %} {{ name }}{% if value is not True %}="{{ value|stringformat:'s' }}"{% endif %}{% endif %}{% endfor %} \ No newline at end of file diff --git a/apps/core/templates/jalali_date/widgets/date.html b/apps/core/templates/jalali_date/widgets/date.html new file mode 100644 index 0000000..ae9c7d0 --- /dev/null +++ b/apps/core/templates/jalali_date/widgets/date.html @@ -0,0 +1 @@ + diff --git a/apps/core/templatetags/__init__.py b/apps/core/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/core/templatetags/tags.py b/apps/core/templatetags/tags.py new file mode 100644 index 0000000..81921eb --- /dev/null +++ b/apps/core/templatetags/tags.py @@ -0,0 +1,30 @@ +from django import template +import jdatetime +from django.core.paginator import Paginator + +register = template.Library() + + +@register.filter(name="to_jalali") +def to_jalali(value): + if value: + return jdatetime.date.fromgregorian(date=value, locale='fa_IR').strftime("%Y/%m/%d") + else: + return value + +@register.filter(name="amount_split_3digit") +def amount_split_3digit(value): + text = str(value)[::-1] + return ','.join([l[::-1] for l in [text[i:i + 3] for i in range(0, len(text), 3)][::-1]]) + + +@register.simple_tag +def get_proper_elided_page_range(p, number, on_each_side=2, on_ends=2): + paginator = Paginator(p.object_list, p.per_page) + return paginator.get_elided_page_range(number=number, + on_each_side=on_each_side, + on_ends=on_ends) + +@register.filter +def get_item(dictionary, key): + return dictionary.get(key) \ No newline at end of file diff --git a/apps/core/tests.py b/apps/core/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/apps/core/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/core/urls.py b/apps/core/urls.py new file mode 100644 index 0000000..7f82b8a --- /dev/null +++ b/apps/core/urls.py @@ -0,0 +1,7 @@ +from django.urls import path, include +from .views import HomeView +app_name = "core" + +urlpatterns = [ + path('', HomeView.as_view(), name='home'), +] diff --git a/apps/core/utils/__init__.py b/apps/core/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/core/utils/jalali_date.py b/apps/core/utils/jalali_date.py new file mode 100644 index 0000000..6c7fd93 --- /dev/null +++ b/apps/core/utils/jalali_date.py @@ -0,0 +1,51 @@ +from django import forms +from django.conf import settings +from django.templatetags.static import static +from django.contrib.admin.widgets import AdminDateWidget +from django.forms.fields import DateField, SplitDateTimeField, TimeField, DateTimeField +from django.utils.encoding import force_str +from datetime import date as datetime_date, datetime as datetime_datetime +from jdatetime import GregorianToJalali, datetime as jalali_datetime +import jdatetime + +class JalaliDateField(DateField): + def __init__(self, *, input_formats=None, **kwargs): + super().__init__(**kwargs) + self.input_formats.insert(0, settings.JALALI_DATE_DEFAULTS['Strftime']['date']) + + def prepare_value(self, value): + if isinstance(value, datetime_date): + date_obj = jdatetime.datetime.fromgregorian(datetime=value) + return date_obj.strftime(settings.JALALI_DATE_DEFAULTS['Strftime']['date']) + + return value + + def strptime(self, value, format): + return jalali_datetime.strptime(force_str(value), format).togregorian().date() + + +class CustomSelectWidget(forms.widgets.Select): + option_template_name = 'widgets/select_option.html' + + +class AdminJalaliDateWidget(AdminDateWidget): + template_name = "jalali_date/widgets/date.html" + + # @property + # def media(self): + # js = settings.JALALI_DATE_DEFAULTS['Static']['js'] + # css = settings.JALALI_DATE_DEFAULTS['Static']['css'] + # return forms.Media(js=[static(path) for path in js], css=css) + + def __init__(self, attrs=None, format=None): + final_attrs = {'class': 'jalali_date-date', 'size': '10'} + if attrs is not None: + final_attrs.update(attrs) + super(AdminJalaliDateWidget, self).__init__(attrs=final_attrs, format=format) + + def render(self, name, value, attrs=None, renderer=None): + """Render the widget as an HTML string.""" + context = self.get_context(name, value, attrs) + return self._render(self.template_name, context, renderer) + + diff --git a/apps/core/views.py b/apps/core/views.py new file mode 100644 index 0000000..3d3cbe5 --- /dev/null +++ b/apps/core/views.py @@ -0,0 +1,10 @@ +from django.contrib.auth.decorators import login_required +from django.shortcuts import render +from django.utils.decorators import method_decorator +from django.views.generic import TemplateView + +# Create your views here. +@method_decorator(login_required, name='dispatch') +class HomeView(TemplateView): + template_name = 'core/home.html' + diff --git a/apps/users/views.py b/apps/users/views.py index ff41ebe..4c4d579 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -47,10 +47,11 @@ class OAUTHLoginCallbackView(DetailView): def get_object(self, queryset=None): state = self.request.GET.get('state') code = self.request.GET.get('code') - obj = OAuthCode.objects.get(pk=state) - obj.code = code - obj.save() - return obj + obj = OAuthCode.objects.filter(pk=state).first() + if obj: + obj.code = code + obj.save() + return obj def introspect_token(self, token): url = settings.OAUTH2_PROVIDER['RESOURCE_SERVER_INTROSPECTION_URL'] diff --git a/apps/wallet/views.py b/apps/wallet/views.py index 49ccef5..ed0dda9 100755 --- a/apps/wallet/views.py +++ b/apps/wallet/views.py @@ -199,6 +199,11 @@ class TransactionDetailView(UpdateView): form_class = TransactionActionForm template_name = 'wallet/transaction_detail.html' + def get_context_data(self, **kwargs): + context_data = super().get_context_data(**kwargs) + context_data['StateChoices'] = StateChoices + return context_data + def get_queryset(self): user = self.request.user return Transaction.objects.filter(Q(payee=user) | Q(payer=user) | Q(payer__isnull=True)).all() diff --git a/templates/core/home.html b/templates/core/home.html new file mode 100644 index 0000000..94287ef --- /dev/null +++ b/templates/core/home.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} +{% load static %} +{% load crispy_forms_tags %} +{% load jalali_tags %} + +{% block title %}wallet: Home{% endblock %} +{% block page_title %}wallet: Home{% endblock %} + + +{% block content %} + wallet +{% endblock %} \ No newline at end of file diff --git a/templates/include/top_bar.html b/templates/include/top_bar.html index 46a6554..d816170 100644 --- a/templates/include/top_bar.html +++ b/templates/include/top_bar.html @@ -18,6 +18,10 @@
transactions
+
+
+ +
{% endif %}
{% if not user.is_authenticated %} diff --git a/templates/wallet/transaction_detail.html b/templates/wallet/transaction_detail.html index d21d0b2..60381c2 100644 --- a/templates/wallet/transaction_detail.html +++ b/templates/wallet/transaction_detail.html @@ -9,12 +9,14 @@ {% endif %}
+ {{ object.state }} + {{ StateChoices.CREATED }} {% csrf_token %} - {% if object.state == object.state_choices.created %} + {% if object.state == StateChoices.CREATED %}
- {% elif object.state == object.state_choices.delayed %} + {% elif object.state == StateChoices.DELAYED %}
diff --git a/wallet/urls.py b/wallet/urls.py index 0cb0e8e..d31a443 100644 --- a/wallet/urls.py +++ b/wallet/urls.py @@ -34,6 +34,7 @@ urlpatterns = [ path('swagger/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'), path('admin/', admin.site.urls), + path('', include('apps.core.urls')), path('wallet/', include('apps.wallet.urls')), path('users/', include('apps.users.urls')), path('oauth2/', include('oauth2_provider.urls', namespace='oauth2_provider')),