101 / api /views.py
thejagstudio's picture
Upload 54 files
085ce5c verified
from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
import requests
import json
import base64
from authentication.models import UserData, Coupon
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from io import BytesIO
from PIL import Image, ImageDraw
from barcode import Code128
authToken = 'fab57498544244e38bfc2741880f8d61:ed9628295b0642e1b38308795c9cdadd58012df4ceb84a3b9d441c017a1eeac0'
def create_barcode_from_binary(binary_text, height=100, line_width=2):
"""
Create a barcode-like image from binary text where:
1 = black line
0 = white space
Parameters:
binary_text (str): String of 1s and 0s
height (int): Height of the barcode in pixels
line_width (int): Width of each line in pixels
output_path (str): Path where the image will be saved
"""
# Validate input
if not all(c in '01' for c in binary_text):
raise ValueError("Input must contain only 0s and 1s")
# Calculate dimensions
width = len(binary_text) * line_width
# Create new white image
image = Image.new('RGB', (width, height), 'white')
draw = ImageDraw.Draw(image)
# Draw black lines for each '1' in the binary text
for i, bit in enumerate(binary_text):
if bit == '1':
x_position = i * line_width
draw.line(
[(x_position, 0), (x_position, height)],
fill='black',
width=line_width
)
return image
class HomeView(APIView):
def get(self, request):
message = "Welcome at home!"
return Response({'message': message})
class BarCodeView(APIView):
def get(self, request,code):
barcode = Code128(code)
encode = barcode.build()[0]
barcode_image = create_barcode_from_binary(
binary_text=encode,
height=100,
line_width=2
)
byte_io = BytesIO()
barcode_image.save(byte_io, 'PNG')
byte_io.seek(0)
return HttpResponse(byte_io, content_type='image/png')
class EstablishmentListView(APIView):
global authToken
def get(self, request):
url = "https://101smokeshop-uat.revelup.com/enterprise/Establishment/?order_by=id&limit=10&offset=0"
headers = {
'API-AUTHENTICATION': authToken
}
response = requests.get(url, headers=headers)
data = response.json().get("objects", [])
urlBase = "https://101smokeshop-uat.revelup.com"
for i in range(len(data)):
try:
imgData = requests.get(urlBase + data[i]["logo_img"], headers=headers).json()
data[i]["logo_img"] = imgData.get("image_url", "")
except:
pass
try:
data[i]["address"] = requests.get(urlBase + data[i]["address"], headers=headers).json()
except:
pass
return JsonResponse({"data": data})
def resources_forward(request, resource_name,image_id):
url = "https://101smokeshop-uat.revelup.com/resources/"+resource_name+"/"+image_id
headers = {
'API-AUTHENTICATION': authToken
}
response = requests.request("GET", url, headers=headers)
imageUrl = response.json()["image_url"]
response = requests.request("GET", imageUrl)
return HttpResponse(response.content, content_type=response.headers['Content-Type'])
def product_category(request):
global authToken
url = "https://101smokeshop-uat.revelup.com/products/ProductCategory/"
headers = {
'API-AUTHENTICATION': authToken
}
response = requests.request("GET", url, headers=headers)
data = response.json()["objects"]
return JsonResponse({"data": data})
class CouponListView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
discount_functions = ["CORE", "CUSTOMER", "LOYALTY", "GIFT_WITH_PURCHASE"]
discount_methods = ["POINT_REDEMPTION", "REDEEMED", "GIVE_AWAY", "BONUS_COUPON", "VOUCHER_GENERIC", "VOUCHER_LOYALTY", "VOUCHER_FUEL", "VOUCHER_THIRDPARTY"]
discount_types = ["AMOUNT", "PERCENT", "RE_PRICE", "ALT_PRICE"]
how_often_apply = ["ALL_APPLICABLE", "ONCE_PER_ORDER", "ONCE_PER_SELECTION"]
qualification_types = ["ALL", "ITEM", "ORDER"]
rewards_types = ["PURCHASES", "ITEMS", "VISIT"]
user = UserData.objects.get(user=request.user)
coupons = user.coupons.all()
redeemedCoupons = user.activatedCoupons.all()
data = []
for coupon in coupons:
data.append({
"name": coupon.name,
"discription": coupon.discription,
"pointsNeededForRedemption": coupon.pointsNeededForRedemption,
"couponCode": coupon.couponCode,
"loyaltyCode": coupon.loyaltyCode,
"discount": coupon.discount,
"isExpired": coupon.isExpired,
"isRedeemed": coupon in redeemedCoupons,
"expiryDate": coupon.expiryDate,
"discountFunction": discount_functions[coupon.discountFunction],
"discountMethod": discount_methods[coupon.discountMethod],
"discountType": discount_types[coupon.discountType],
"howOftenApply": how_often_apply[coupon.howOftenApply],
"qualificationType": qualification_types[coupon.qualificationType],
"rewardsType": rewards_types[coupon.rewardsType],
})
return JsonResponse({"data": data})
class CouponRedeemView(APIView):
permission_classes = [IsAuthenticated]
def post(self, request):
couponCode = request.data["couponCode"]
user = UserData.objects.get(user=request.user)
coupon = Coupon.objects.get(couponCode=couponCode)
if coupon not in user.coupons.all() or coupon == None:
return JsonResponse({"message": "Coupon is not available for this user"})
if coupon.isExpired:
return JsonResponse({"message": "Coupon is expired"})
if user.rewardPoints < coupon.pointsNeededForRedemption:
return JsonResponse({"message": "You don't have enough points to redeem this coupon"})
user.rewardPoints -= coupon.pointsNeededForRedemption
user.save()
user.activatedCoupons.add(coupon)
return JsonResponse({"message": "Coupon redeemed successfully"})