Merge branch 'main' of https://github.com/Byeto-Company/hossein_por_shop
This commit is contained in:
@@ -34,6 +34,10 @@ jobs:
|
||||
mkdir -p /root/hshop/backend/
|
||||
printf "%s" "${{ secrets.ENV_FILE_CONTENT }}" > /root/hshop/backend/.env.local
|
||||
|
||||
mkdir -p /root/hshop/frontend/
|
||||
printf "%s" "${{ secrets.FRONTEND_ENV }}" > /root/hshop/frontend/.env
|
||||
|
||||
|
||||
- name: Build and start Docker containers
|
||||
uses: appleboy/ssh-action@v0.1.6
|
||||
with:
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-28 15:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('account', '0024_alter_user_birth_date'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='pushsubscription',
|
||||
options={'verbose_name': 'اشتراک نوتیفیکیشن', 'verbose_name_plural': 'اشتراک های نوتیفیکیشن'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='useraddressmodel',
|
||||
name='is_main',
|
||||
field=models.BooleanField(default=False, verbose_name='ادرس اصلی کاربر'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-28 15:39
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('azbankgateways', '0007_alter_bank_order'),
|
||||
('order', '0025_alter_ordermodel_order_id'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='bank',
|
||||
name='order',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='bank_records', to='order.ordermodel', verbose_name='سفارش'),
|
||||
),
|
||||
]
|
||||
@@ -244,7 +244,7 @@ AZ_IRANIAN_BANK_GATEWAYS = {
|
||||
"ZIBAL": {
|
||||
"MERCHANT_CODE": "zibal",
|
||||
"SANDBOX": True
|
||||
},
|
||||
}
|
||||
},
|
||||
"IS_SAMPLE_FORM_ENABLE": True,
|
||||
"DEFAULT": "ZIBAL",
|
||||
@@ -255,5 +255,6 @@ AZ_IRANIAN_BANK_GATEWAYS = {
|
||||
"BANK_PRIORITIES": [
|
||||
"ZIBAL",
|
||||
],
|
||||
"IS_SAFE_GET_GATEWAY_PAYMENT": False # better to be True
|
||||
}
|
||||
"IS_SAFE_GET_GATEWAY_PAYMENT": True # better to be True
|
||||
}
|
||||
DEFAULT_TAX_RATE = 20
|
||||
@@ -2,7 +2,7 @@ from .base import *
|
||||
from .unfold_conf import *
|
||||
|
||||
|
||||
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', DOMAIN, API_DOMAIN]
|
||||
ALLOWED_HOSTS = ['127.0.0.1', 'localhost', DOMAIN, API_DOMAIN, '0.0.0.0',]
|
||||
CSRF_TRUSTED_ORIGINS = [
|
||||
f"https://{DOMAIN}",
|
||||
f"http://{DOMAIN}",
|
||||
|
||||
@@ -52,7 +52,7 @@ def random_data():
|
||||
"kpi": [
|
||||
{
|
||||
"title": "گوشی Iphone 16 pro",
|
||||
"metric": f"${intcomma(f"{random.uniform(1000, 9999):.02f}")}",
|
||||
"metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}",
|
||||
"footer": mark_safe(
|
||||
f'<strong class="text-green-700 font-semibold dark:text-green-400">+{intcomma(f"{random.uniform(1, 9):.02f}")}%</strong> درصد فروش کل'
|
||||
),
|
||||
@@ -65,14 +65,14 @@ def random_data():
|
||||
},
|
||||
{
|
||||
"title": "لپ تاپ Macbook Pro M3",
|
||||
"metric": f"${intcomma(f"{random.uniform(1000, 9999):.02f}")}",
|
||||
"metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}",
|
||||
"footer": mark_safe(
|
||||
f'<strong class="text-green-700 font-semibold dark:text-green-400">+{intcomma(f"{random.uniform(1, 9):.02f}")}%</strong> درصد فروش کل'
|
||||
),
|
||||
},
|
||||
{
|
||||
"title": "ساعت هوشمند Apple Watch 8",
|
||||
"metric": f"${intcomma(f"{random.uniform(1000, 9999):.02f}")}",
|
||||
"metric": f"${intcomma(f'{random.uniform(1000, 9999):.02f}')}",
|
||||
"footer": mark_safe(
|
||||
f'<strong class="text-green-700 font-semibold dark:text-green-400">+{intcomma(f"{random.uniform(1, 9):.02f}")}%</strong> درصد فروش کل'
|
||||
),
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-28 15:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('order', '0024_orderitemmodel_discount_ordermodel_order_id'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='ordermodel',
|
||||
name='order_id',
|
||||
field=models.PositiveIntegerField(blank=True, null=True, unique=True, verbose_name='شماره سفارش'),
|
||||
),
|
||||
]
|
||||
@@ -66,9 +66,11 @@ class OrderModel(models.Model):
|
||||
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
# genrate order id
|
||||
if not self.pk:
|
||||
last_instance = self.__class__.objects.order_by("pk").last()
|
||||
self.order_id = (last_instance.pk + 1001) if last_instance else 1001
|
||||
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
|
||||
+11
-27
@@ -3,6 +3,8 @@ from django.dispatch import receiver
|
||||
from .models import OrderModel
|
||||
from account.models import PushSubscription
|
||||
import ghasedak_sms
|
||||
from .tasks import send_change_status_notif, send_change_status_sms
|
||||
|
||||
|
||||
@receiver(pre_save, sender=OrderModel)
|
||||
def order_status_changed(sender, instance, **kwargs):
|
||||
@@ -10,36 +12,18 @@ def order_status_changed(sender, instance, **kwargs):
|
||||
previous = OrderModel.objects.get(pk=instance.pk)
|
||||
|
||||
if previous.status != instance.status:
|
||||
send_change_status_notif(instance)
|
||||
send_change_status_sms(instance)
|
||||
new_status = instance.get_status_display()
|
||||
send_change_status_notif.delay(instance.pk, new_status)
|
||||
send_change_status_sms.delay(instance.pk, new_status)
|
||||
|
||||
if previous.status == 'CART' and instance.status == 'ADMIN_PENDING':
|
||||
# update_cart_price_fields()
|
||||
# update_sell_data()
|
||||
# update_quantity()
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def send_change_status_notif(instance):
|
||||
user_subs = PushSubscription.objects.filter(user=instance.user)
|
||||
for user_sub in user_subs:
|
||||
try:
|
||||
user_sub.send_notif(f'سفارش شما به {instance.get_status_display()} تغییر کرد', f'سفارش شما به {instance.get_status_display()} تغییر کرد', ProductImageModel.objects.all().first().image.url)
|
||||
except:
|
||||
print('log later send notif error')
|
||||
|
||||
|
||||
def send_change_status_sms(instance):
|
||||
sms_api = ghasedak_sms.Ghasedak(api_key="1227eaaddcba72bcb0169b37032cf16ae9ac6ed8b3b7c2768b74e2ee351d1b52gyRe3AGomZRPTNEd")
|
||||
|
||||
|
||||
response = sms_api.send_single_sms(
|
||||
ghasedak_sms.SendSingleSmsInput(
|
||||
message=f'سفارش شما به {instance.get_status_display()} تغییر کرد',
|
||||
receptor=instance.user.phone,
|
||||
line_number='30005006004095',
|
||||
client_reference_id=str(instance.user.pk)
|
||||
)
|
||||
)
|
||||
if response['statusCode'] == 200:
|
||||
print('done log later')
|
||||
else:
|
||||
print(f'error: {response}')
|
||||
|
||||
|
||||
def update_cart_price_fields(order):
|
||||
|
||||
+34
-2
@@ -4,7 +4,9 @@ from azbankgateways import (
|
||||
models as bank_models,
|
||||
default_settings as settings,
|
||||
)
|
||||
|
||||
from .models import OrderModel
|
||||
from account.models import PushSubscription
|
||||
import ghasedak_sms
|
||||
|
||||
from celery import shared_task
|
||||
|
||||
@@ -23,4 +25,34 @@ def udpate_bank_status():
|
||||
if bank_record.is_success:
|
||||
logging.debug("This record is verify now.", extra={"pk": bank_record.pk})
|
||||
|
||||
print('update bank record is done')
|
||||
return 'update bank record is done'
|
||||
|
||||
|
||||
@shared_task
|
||||
def send_change_status_notif(instance_pk, new_status):
|
||||
instance = OrderModel.objects.get(pk=instance_pk)
|
||||
user_subs = PushSubscription.objects.filter(user=instance.user)
|
||||
for user_sub in user_subs:
|
||||
try:
|
||||
user_sub.send_notif(f'سفارش شما به {new_status} تغییر کرد', f'سفارش شما به {new_status} تغییر کرد', ProductImageModel.objects.all().first().image.url)
|
||||
except:
|
||||
print('log later send notif error')
|
||||
|
||||
@shared_task
|
||||
def send_change_status_sms(instance_pk, new_status):
|
||||
instance = OrderModel.objects.get(pk=instance_pk)
|
||||
sms_api = ghasedak_sms.Ghasedak(api_key="1227eaaddcba72bcb0169b37032cf16ae9ac6ed8b3b7c2768b74e2ee351d1b52gyRe3AGomZRPTNEd")
|
||||
|
||||
|
||||
response = sms_api.send_single_sms(
|
||||
ghasedak_sms.SendSingleSmsInput(
|
||||
message=f'سفارش شما به {new_status} تغییر کرد',
|
||||
receptor=instance.user.phone,
|
||||
line_number='30005006004095',
|
||||
client_reference_id=str(instance.user.pk)
|
||||
)
|
||||
)
|
||||
if response['statusCode'] == 200:
|
||||
return 'done log later'
|
||||
else:
|
||||
return f'error: {response}'
|
||||
@@ -197,7 +197,7 @@ class OrderGetView(APIView):
|
||||
from rest_framework import serializers
|
||||
|
||||
class BankTypeSerializer(serializers.Serializer):
|
||||
gateway_type = serializers.ChoiceField(choices=['BMI', 'SEP', 'ZARINPAL', 'IDPAY', 'ZIBAL', 'BAHAMTA', 'MELLAT', 'PAYV1'])
|
||||
gateway_type = serializers.ChoiceField(choices=['ZIBAL', 'BMI', 'SEP', 'ZARINPAL', 'IDPAY', 'BAHAMTA', 'MELLAT', 'PAYV1'])
|
||||
|
||||
|
||||
class PaymentView(APIView):
|
||||
@@ -210,18 +210,19 @@ class PaymentView(APIView):
|
||||
def post(self, request):
|
||||
print(request.data.get('gateway_type'))
|
||||
cart_order = get_object_or_404(OrderModel, user=request.user, status='CART')
|
||||
amount = 5000
|
||||
amount = 10000
|
||||
user_mobile_number = request.user.phone
|
||||
|
||||
factory = bankfactories.BankFactory()
|
||||
try:
|
||||
bank = (
|
||||
factory.auto_create()
|
||||
factory.create(
|
||||
bank_models.BankType.ZIBAL
|
||||
)
|
||||
)
|
||||
bank.set_request(request)
|
||||
bank.set_amount(amount)
|
||||
|
||||
bank.set_client_callback_url(request.build_absolute_uri(reverse("callback-gateway")))
|
||||
bank.set_client_callback_url(reverse("callback-gateway"))
|
||||
print(reverse('callback-gateway'))
|
||||
bank.set_mobile_number(user_mobile_number)
|
||||
|
||||
@@ -230,7 +231,7 @@ class PaymentView(APIView):
|
||||
# cart_order.save()
|
||||
bank_record.order = cart_order
|
||||
bank_record.save()
|
||||
return Response(bank.redirect_gateway().url)
|
||||
return Response(bank.get_gateway())
|
||||
except AZBankGatewaysException as e:
|
||||
print(e)
|
||||
return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-28 15:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('product', '0034_remove_productvariant_max_price_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='attributetype',
|
||||
options={'verbose_name': 'نوع متغییر محصول', 'verbose_name_plural': 'نوع های متغییر محصول'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='attributevalue',
|
||||
options={'verbose_name': 'مقدار متغییر محصول', 'verbose_name_plural': 'مقدار های متغییر محصول'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='attributetype',
|
||||
name='name',
|
||||
field=models.CharField(max_length=100, verbose_name='نام نوع متغییر'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
# Generated by Django 5.1.2 on 2025-03-28 15:39
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('ticket', '0018_alter_ticket_created_at_alter_ticket_updated_at'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='attachment',
|
||||
options={'verbose_name': 'پیوست تیکت', 'verbose_name_plural': 'پیوست های تیکت'},
|
||||
),
|
||||
]
|
||||
+10
-3
@@ -10,9 +10,10 @@ services:
|
||||
networks:
|
||||
- default
|
||||
environment:
|
||||
- API_BASE_URL="https://api.heymlz.com"
|
||||
- DEBUG="false"
|
||||
- NUXT_IMAGE_DOMAINS="https://c262408.parspack.net"
|
||||
- API_BASE_URL=https://api.heymlz.com
|
||||
- DEBUG=false
|
||||
- NUXT_IMAGE_DOMAINS=https://c262408.parspack.net
|
||||
restart: always
|
||||
|
||||
django:
|
||||
container_name: shop_backend
|
||||
@@ -28,6 +29,7 @@ services:
|
||||
- media_data:/app/static
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
db:
|
||||
container_name: shop_db
|
||||
@@ -42,6 +44,7 @@ services:
|
||||
- "5434:5432"
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
db-backup:
|
||||
container_name: shop_backup
|
||||
@@ -62,6 +65,7 @@ services:
|
||||
- backups:/backups
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
|
||||
redis:
|
||||
@@ -71,6 +75,7 @@ services:
|
||||
- "6379:6379"
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
celery_worker:
|
||||
container_name: shop_celery_worker
|
||||
@@ -86,6 +91,7 @@ services:
|
||||
- CELERY_BROKER_URL=redis://redis:6379/0
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
celery_beat:
|
||||
container_name: shop_celery_beat
|
||||
@@ -101,6 +107,7 @@ services:
|
||||
- CELERY_BROKER_URL=redis://redis:6379/0
|
||||
networks:
|
||||
- default
|
||||
restart: always
|
||||
|
||||
|
||||
volumes:
|
||||
|
||||
Reference in New Issue
Block a user