You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

282 lines
7.8 KiB
Python

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
import requests
from .decorators import *
from billing.models import *
import base64
# Create your views here.
@customer_login_required
def customer_invoices(request, *args, **kwargs):
context = {
}
return render(request, 'listing_pages/customer-invoices.html', context)
@customer_login_required
def all_products(request, *args, **kwargs):
context = {
}
return render(request, 'listing_pages/products.html', context)
@customer_login_required
def customer_orders(request, *args, **kwargs):
customer = request.user.customerprofile
orders = Order.objects.filter(customer=customer, status='Completed')
context = {
'orders': orders,
}
return render(request, 'listing_pages/customer-orders.html', context)
# PRODUCTS
@customer_login_required
def osimenu_plans(request, *args, **kwargs):
osimenu_basic = Item.objects.filter(title='OSIMENU BASIC').first()
osimenu_standard = Item.objects.filter(title='OSIMENU STANDARD').first()
osimenu_premium = Item.objects.filter(title='OSIMENU PREMIUM').first()
context = {
'osimenu_basic': osimenu_basic,
'osimenu_standard': osimenu_standard,
'osimenu_premium': osimenu_premium,
}
return render(request, 'products/osimenu-plans.html', context)
@customer_login_required
def osicard_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/osicard-plans.html', context)
@customer_login_required
def shared_hosting_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/shared-hosting-plans.html', context)
@customer_login_required
def cloud_vps_hosting_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/cloud-vps-hosting-plans.html', context)
@customer_login_required
def dedicated_servers_plans(request, *args, **kwargs):
context = {
}
return render(request, 'products/dedicated-servers-plans.html', context)
@customer_login_required
def payment(request, item_id):
item = get_object_or_404(Item, id=item_id)
context = {
'item' : item,
}
return render(request, 'payment.html', context)
def basic_auth_header(username, password):
credentials = f"merchant.{username}:{password}"
encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
return f"Basic {encoded_credentials}"
@customer_login_required
def initiate_checkout(request):
api_username = 'merchant.TEST06127800'
api_password = '37846250a67c70e7fe9f82cf6ca81f93'
merchant_id = 'TEST06127800'
merchant_name = 'Ositcom Sal'
customer = request.user.customerprofile
item_id = request.headers.get('X-Item-ID')
item = Item.objects.get(id=item_id)
order = Order.objects.create(status='None', customer=customer)
order.save()
order_id = order.order_id
order_item = OrderItem.objects.create(order=order, item=item)
order_item.save()
payload = {
'apiOperation': 'INITIATE_CHECKOUT',
'apiUsername': api_username,
'apiPassword': api_password,
'merchant': merchant_id,
'interaction.operation': 'PURCHASE',
'interaction.merchant.name': merchant_name,
'order.id': order_id,
'order.amount': '100.00',
'order.currency': 'USD',
'order.description': 'description_of_order',
'order.notificationUrl' : 'https://newosina.osinode.com/webhooks/',
'interaction.returnUrl' : f"https://newosina.osinode.com/check-order-status/{merchant_id}/{order_id}/"
}
try:
response = requests.post('https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/78', data=payload)
print('Response Content:', response.text)
if response.status_code == 200:
response_data = response.text
parsed_data = dict(item.split('=') for item in response_data.split('&'))
session_id = parsed_data.get('session.id')
return JsonResponse({'session_id': session_id}, status=200)
else:
print('Response Status Code:', response.status_code)
return JsonResponse({'error': 'Failed to initiate checkout'}, status=500)
except Exception as e:
print('Exception:', e)
return JsonResponse({'error': 'Internal Server Error'}, status=500)
def check_order_status(request, merchant_id, order_id):
api_password = '37846250a67c70e7fe9f82cf6ca81f93'
url = f"https://creditlibanais-netcommerce.gateway.mastercard.com/api/rest/version/78/merchant/{merchant_id}/order/{order_id}"
order = Order.objects.get(order_id=order_id)
headers = {
'Content-Type': 'application/json',
'Authorization': basic_auth_header(merchant_id, api_password)
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
order_details = response.json()
if order_details.get('result') == 'SUCCESS':
order.status = 'Completed'
order.save()
order_items = OrderItem.objects.filter(order=order)
for order_item in order_items:
order_item.purchased_at = datetime.now()
recurring_cycle = 30
due_date = order_item.purchased_at + timedelta(days=recurring_cycle)
order_item.due_at = due_date
order_item.save()
return redirect('orders')
error_message = 'Failed to retrieve order details: ' + response.text
return JsonResponse({'error': error_message}, status=500)
except Exception as e:
error_message = 'Exception: ' + str(e)
return JsonResponse({'error': error_message}, status=500)
def buy_free_osimenu(request):
api_url = 'https://osimenu.com/api/create-subscription/'
api_data = {
'user': {
'username': request.user.email,
'email': request.user.email,
'password': 'OSITCOM2024',
'first_name': request.user.first_name,
'last_name': request.user.last_name
},
'customer': {
'mobile_number': request.user.customerprofile.mobile_number
},
'subscription': {
'plan': 'OSIMENU BASIC'
}
}
order = Order.objects.create(
customer = request.user.customerprofile,
status = 'Completed'
)
order_item = OrderItem.objects.create(
order = order,
item = get_object_or_404(Item, title='OSIMENU BASIC'),
purchased_at = datetime.now(),
)
response = requests.post(api_url, json=api_data)
print(response)
return redirect('customerorders')
def buy_free_osicard(request):
api_url = 'https://mybusinesscardpage.com/api/create-subscription/'
api_data = {
'user': {
'username': request.user.email,
'email': request.user.email,
'password': 'OSITCOM2024',
'first_name': request.user.first_name,
'last_name': request.user.last_name
},
'customer': {
'mobile_number': request.user.customerprofile.mobile_number
},
'subscription': {
'plan': 'OSICARD BASIC'
}
}
order = Order.objects.create(
customer = request.user.customerprofile,
status = 'Completed'
)
order_item = OrderItem.objects.create(
order = order,
item = get_object_or_404(Item, title='OSICARD BASIC'),
purchased_at = datetime.now(),
)
response = requests.post(api_url, json=api_data)
print(response)
return redirect('customerorders')