merge
This commit is contained in:
@@ -242,7 +242,7 @@ AWS_S3_OBJECT_PARAMETERS = {
|
||||
AZ_IRANIAN_BANK_GATEWAYS = {
|
||||
"GATEWAYS": {
|
||||
"ZARINPAL": {
|
||||
"MERCHANT_CODE": "",
|
||||
"MERCHANT_CODE": "9cf93a18-dc99-4e6c-8873-d37a8190a027",
|
||||
"SANDBOX": 0,
|
||||
},
|
||||
},
|
||||
|
||||
@@ -13,4 +13,11 @@ MEDIA_URL = '/shop_media/'
|
||||
MEDIA_ROOT = 'app/media'
|
||||
|
||||
STATIC_URL = '/shop_static/'
|
||||
STATIC_ROOT = 'app/static'
|
||||
STATIC_ROOT = 'app/static'
|
||||
|
||||
# ==============================================================================
|
||||
# to avoid gateway post problem
|
||||
# ==============================================================================
|
||||
|
||||
USE_X_FORWARDED_HOST = True
|
||||
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||
+18
-5
@@ -7,7 +7,7 @@ from unfold.contrib.import_export.forms import ExportForm, ImportForm, Selectabl
|
||||
from unfold.contrib.forms.widgets import ArrayWidget, WysiwygWidget
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from utils.admin import ModelAdmin
|
||||
|
||||
from django.utils.html import format_html, format_html_join
|
||||
class OrderItemModelInline(StackedInline):
|
||||
model = OrderItemModel
|
||||
extra = 0
|
||||
@@ -33,14 +33,27 @@ class OrderAdmin(ModelAdmin, ImportExportModelAdmin):
|
||||
|
||||
list_filter = ['is_paid', 'status']
|
||||
|
||||
list_display = ['user', 'is_paid', 'status', 'discount_code', 'address']
|
||||
readonly_fields = ('created_at',)
|
||||
list_display = ['user', 'is_paid', 'status', 'discount_code', 'address', ]
|
||||
readonly_fields = ('created_at', 'bank_links')
|
||||
compressed_fields = True
|
||||
warn_unsaved_form = True
|
||||
|
||||
exclude = ('bank_records',)
|
||||
formfield_overrides = {
|
||||
ArrayField: {
|
||||
"widget": ArrayWidget,
|
||||
}
|
||||
}
|
||||
inlines = [OrderItemModelInline]
|
||||
inlines = [OrderItemModelInline]
|
||||
def bank_links(self, obj):
|
||||
banks = obj.bank_records.all()
|
||||
|
||||
if not banks.exists():
|
||||
return "-"
|
||||
|
||||
return format_html_join(
|
||||
"",
|
||||
'<a style="padding-bottom:10px;display:block;" href="/secret-admin/azbankgateways/bank/{}/change/" class="text-primary-600 dark:text-primary-500">{}</a>',
|
||||
[(bank.id, bank.tracking_code) for bank in banks]
|
||||
) or "-"
|
||||
|
||||
bank_links.short_description = "Bank Records"
|
||||
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-14 17:43
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('azbankgateways', '0005_alter_bank_bank_type_alter_bank_created_at_and_more'),
|
||||
('order', '0016_rename_payment_paymentmodel'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='ordermodel',
|
||||
name='bank_record',
|
||||
field=models.OneToOneField(blank=True, max_length=100, null=True, on_delete=django.db.models.deletion.SET_NULL, to='azbankgateways.bank', verbose_name='رکورد بانکی'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,16 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-14 17:45
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0017_ordermodel_bank_record'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(
|
||||
name='PaymentModel',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-14 18:54
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('azbankgateways', '0005_alter_bank_bank_type_alter_bank_created_at_and_more'),
|
||||
('order', '0018_delete_paymentmodel'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='ordermodel',
|
||||
name='bank_record',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='ordermodel',
|
||||
name='bank_record',
|
||||
field=models.ManyToManyField(blank=True, max_length=100, null=True, to='azbankgateways.bank', verbose_name='رکورد بانکی'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-14 19:13
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0019_remove_ordermodel_bank_record_ordermodel_bank_record'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='ordermodel',
|
||||
old_name='bank_record',
|
||||
new_name='bank_records',
|
||||
),
|
||||
]
|
||||
+5
-13
@@ -4,6 +4,8 @@ from product.models import ProductModel, ProductVariant, ProductImageModel
|
||||
from django.utils import timezone
|
||||
from .execptions import DiscountNotAvailableError
|
||||
from django_jalali.db import models as jmodels
|
||||
from azbankgateways.models.banks import Bank
|
||||
|
||||
|
||||
class DiscountCode(models.Model):
|
||||
code = models.CharField(max_length=50, verbose_name='کد تخفیف')
|
||||
@@ -42,7 +44,7 @@ class OrderModel(models.Model):
|
||||
('POSTED', 'ارسال شده'),
|
||||
('RECEIVED', 'تحویل شده'),
|
||||
('CANCELED', 'لغو شده'),
|
||||
('BACK', 'مرجوع شده'),
|
||||
('REFUNDED', 'مرجوع شده'),
|
||||
]
|
||||
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders', verbose_name='کاربر')
|
||||
address = models.ForeignKey(UserAddressModel, on_delete=models.SET_NULL, related_name='orders', null=True, verbose_name='ادرس')
|
||||
@@ -54,8 +56,8 @@ class OrderModel(models.Model):
|
||||
tax = models.BigIntegerField(null=True, blank=True, verbose_name='مالیات')
|
||||
final_price = models.BigIntegerField(null=True, blank=True, verbose_name='قیمت نهایی')
|
||||
cart_total = models.BigIntegerField(null=True, blank=True, verbose_name='کل سبد خرید')
|
||||
|
||||
|
||||
bank_records = models.ManyToManyField(Bank, max_length=100, verbose_name='رکورد بانکی', null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return f'سفارش: {self.id}'
|
||||
|
||||
@@ -120,13 +122,3 @@ class OrderItemModel(models.Model):
|
||||
def __str__(self):
|
||||
return f'({self.product}) - ({self.order.user})'
|
||||
|
||||
|
||||
#TODO complate this shit
|
||||
class PaymentModel(models.Model):
|
||||
amount = models.PositiveIntegerField()
|
||||
status = models.CharField(max_length=50, default='Pending')
|
||||
tracking_code = models.CharField(max_length=100, blank=True)
|
||||
bank_type = models.CharField(max_length=100)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
def __str__(self):
|
||||
return 'payment'
|
||||
@@ -96,9 +96,13 @@ class OrderSerializer(serializers.ModelSerializer):
|
||||
count = serializers.SerializerMethodField()
|
||||
images = serializers.SerializerMethodField()
|
||||
order_id = serializers.SerializerMethodField()
|
||||
verbose_status = serializers.SerializerMethodField()
|
||||
class Meta:
|
||||
model = OrderModel
|
||||
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id']
|
||||
fields = ['created_at', 'status', "images", "count", "id", 'final_price', 'order_id', 'verbose_status']
|
||||
|
||||
def get_verbose_status(self, obj):
|
||||
return obj.get_status_display()
|
||||
|
||||
def get_count(self, obj):
|
||||
return obj.items.all().count()
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
import logging
|
||||
from azbankgateways import (
|
||||
bankfactories,
|
||||
models as bank_models,
|
||||
default_settings as settings,
|
||||
)
|
||||
|
||||
# factory = bankfactories.BankFactory()
|
||||
|
||||
# bank_models.Bank.objects.update_expire_records()
|
||||
|
||||
# for item in bank_models.Bank.objects.filter_return_from_bank():
|
||||
# bank = factory.create(
|
||||
# bank_type=item.bank_type, identifier=item.bank_choose_identifier
|
||||
# )
|
||||
# bank.verify(item.tracking_code)
|
||||
# bank_record = bank_models.Bank.objects.get(tracking_code=item.tracking_code)
|
||||
# if bank_record.is_success:
|
||||
# logging.debug("This record is verify now.", extra={"pk": bank_record.pk})
|
||||
+13
-6
@@ -7,7 +7,7 @@ from rest_framework.permissions import IsAuthenticated
|
||||
from .serializers import *
|
||||
# from cart.models import
|
||||
from rest_framework import status
|
||||
from .models import OrderItemModel, OrderModel, DiscountCode, PaymentModel
|
||||
from .models import OrderItemModel, OrderModel, DiscountCode
|
||||
from .permissons import CanDeleteCartItemPermissions
|
||||
from azbankgateways import bankfactories, models as bank_models
|
||||
from azbankgateways.exceptions import AZBankGatewaysException
|
||||
@@ -127,7 +127,7 @@ class OrderlistView(APIView):
|
||||
OpenApiParameter(
|
||||
name="status",
|
||||
description=(
|
||||
"['CART', 'ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'BACK']"
|
||||
"['ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'REFUNDED']"
|
||||
),
|
||||
required=False,
|
||||
type=OpenApiTypes.STR,
|
||||
@@ -149,7 +149,7 @@ class OrderlistView(APIView):
|
||||
orders = OrderModel.objects.filter(user=user).exclude(status="CART")
|
||||
status_filter = request.query_params.get("status", None)
|
||||
sort = request.query_params.get('sort', None)
|
||||
if status_filter in ['CART', 'ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'BACK']:
|
||||
if status_filter in [ 'ADMIN_PENDING', 'PENDING', 'POSTED', 'RECEIVED', 'CANCELED', 'REFUNDED']:
|
||||
orders.filter(status=status_filter)
|
||||
if sort:
|
||||
if sort not in ['created_at', '-created_at', 'final_price', '-final_price']:
|
||||
@@ -164,8 +164,10 @@ class OrderlistView(APIView):
|
||||
|
||||
|
||||
class PaymentView(APIView):
|
||||
permission_classes = [IsAuthenticated]
|
||||
def post(self, request):
|
||||
amount = 10000000
|
||||
cart_order = get_object_or_404(OrderModel, user=request.user, status='CART')
|
||||
amount = 5000
|
||||
user_mobile_number = request.user.phone
|
||||
|
||||
factory = bankfactories.BankFactory()
|
||||
@@ -177,9 +179,13 @@ class PaymentView(APIView):
|
||||
bank.set_amount(amount)
|
||||
|
||||
bank.set_client_callback_url(request.build_absolute_uri(reverse("callback-gateway")))
|
||||
print(reverse('callback-gateway'))
|
||||
bank.set_mobile_number(user_mobile_number)
|
||||
|
||||
bank_record = bank.ready()
|
||||
cart_order.bank_records.add(bank_record)
|
||||
cart_order.save()
|
||||
print(bank.redirect_gateway().url)
|
||||
return Response(bank.redirect_gateway().url)
|
||||
except AZBankGatewaysException as e:
|
||||
print(e)
|
||||
@@ -194,11 +200,12 @@ from django.views.decorators.csrf import csrf_exempt
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.response import Response
|
||||
from azbankgateways import bankfactories, models as bank_models
|
||||
from django.http import Http404, HttpResponse
|
||||
|
||||
@csrf_exempt
|
||||
@api_view(['POST'])
|
||||
@api_view(['GET'])
|
||||
def callback_view(request):
|
||||
tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
|
||||
tracking_code = request.GET.get('tc', None)
|
||||
if not tracking_code:
|
||||
logging.debug("این لینک معتبر نیست.")
|
||||
raise Http404
|
||||
|
||||
Reference in New Issue
Block a user