diff --git a/.DS_Store b/.DS_Store index 952c9f83..5e4ef4e6 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/osinaweb/.DS_Store b/osinaweb/.DS_Store index 2836bb73..0f91ee00 100644 Binary files a/osinaweb/.DS_Store and b/osinaweb/.DS_Store differ diff --git a/osinaweb/customercore/.DS_Store b/osinaweb/customercore/.DS_Store new file mode 100644 index 00000000..d4651521 Binary files /dev/null and b/osinaweb/customercore/.DS_Store differ diff --git a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-products.html b/osinaweb/customercore/__init__.py similarity index 100% rename from osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-products.html rename to osinaweb/customercore/__init__.py diff --git a/osinaweb/customercore/__pycache__/__init__.cpython-310.pyc b/osinaweb/customercore/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..9f8f1cce Binary files /dev/null and b/osinaweb/customercore/__pycache__/__init__.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/admin.cpython-310.pyc b/osinaweb/customercore/__pycache__/admin.cpython-310.pyc new file mode 100644 index 00000000..bc8cfe44 Binary files /dev/null and b/osinaweb/customercore/__pycache__/admin.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/apps.cpython-310.pyc b/osinaweb/customercore/__pycache__/apps.cpython-310.pyc new file mode 100644 index 00000000..fb2e1ba9 Binary files /dev/null and b/osinaweb/customercore/__pycache__/apps.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/decorators.cpython-310.pyc b/osinaweb/customercore/__pycache__/decorators.cpython-310.pyc new file mode 100644 index 00000000..2cac15a8 Binary files /dev/null and b/osinaweb/customercore/__pycache__/decorators.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/models.cpython-310.pyc b/osinaweb/customercore/__pycache__/models.cpython-310.pyc new file mode 100644 index 00000000..8ae1b72a Binary files /dev/null and b/osinaweb/customercore/__pycache__/models.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/urls.cpython-310.pyc b/osinaweb/customercore/__pycache__/urls.cpython-310.pyc new file mode 100644 index 00000000..901ec3ca Binary files /dev/null and b/osinaweb/customercore/__pycache__/urls.cpython-310.pyc differ diff --git a/osinaweb/customercore/__pycache__/views.cpython-310.pyc b/osinaweb/customercore/__pycache__/views.cpython-310.pyc new file mode 100644 index 00000000..c81f13d6 Binary files /dev/null and b/osinaweb/customercore/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/customercore/admin.py b/osinaweb/customercore/admin.py new file mode 100644 index 00000000..8c38f3f3 --- /dev/null +++ b/osinaweb/customercore/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/osinaweb/customercore/apps.py b/osinaweb/customercore/apps.py new file mode 100644 index 00000000..d919b3a9 --- /dev/null +++ b/osinaweb/customercore/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CustomercoreConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'customercore' diff --git a/osinaweb/customercore/decorators.py b/osinaweb/customercore/decorators.py new file mode 100644 index 00000000..e59d7b5b --- /dev/null +++ b/osinaweb/customercore/decorators.py @@ -0,0 +1,13 @@ +from functools import wraps +from django.shortcuts import redirect +from osinacore.models import * +def customer_login_required(view_func): + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + # Check if the user is logged in and is a staff member + if not request.user.is_authenticated or not CustomerProfile.objects.filter(user=request.user): + return redirect('signout') # Redirect to login URL if not staff + + return view_func(request, *args, **kwargs) + + return _wrapped_view diff --git a/osinaweb/customercore/migrations/__init__.py b/osinaweb/customercore/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/customercore/migrations/__pycache__/__init__.cpython-310.pyc b/osinaweb/customercore/migrations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 00000000..5c350bb5 Binary files /dev/null and b/osinaweb/customercore/migrations/__pycache__/__init__.cpython-310.pyc differ diff --git a/osinaweb/customercore/models.py b/osinaweb/customercore/models.py new file mode 100644 index 00000000..71a83623 --- /dev/null +++ b/osinaweb/customercore/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/osinaweb/customercore/templates/.DS_Store b/osinaweb/customercore/templates/.DS_Store new file mode 100644 index 00000000..f25a0aa6 Binary files /dev/null and b/osinaweb/customercore/templates/.DS_Store differ diff --git a/osinaweb/osinacore/templates/customer_dashboard/customer_main.html b/osinaweb/customercore/templates/customer_main.html similarity index 100% rename from osinaweb/osinacore/templates/customer_dashboard/customer_main.html rename to osinaweb/customercore/templates/customer_main.html diff --git a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html b/osinaweb/customercore/templates/listing_pages/customer-invoices.html similarity index 98% rename from osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html rename to osinaweb/customercore/templates/listing_pages/customer-invoices.html index fb65a7ae..39c2d9d0 100644 --- a/osinaweb/osinacore/templates/customer_dashboard/listing_pages/customer-invoices.html +++ b/osinaweb/customercore/templates/listing_pages/customer-invoices.html @@ -1,4 +1,4 @@ -{% extends "customer_dashboard/customer_main.html" %} +{% extends "customer_main.html" %} {%load static%} {% block content %} diff --git a/osinaweb/customercore/templates/listing_pages/customer-products.html b/osinaweb/customercore/templates/listing_pages/customer-products.html new file mode 100644 index 00000000..e69de29b diff --git a/osinaweb/osinacore/templates/customer_dashboard/pricing.html b/osinaweb/customercore/templates/pricing.html similarity index 99% rename from osinaweb/osinacore/templates/customer_dashboard/pricing.html rename to osinaweb/customercore/templates/pricing.html index 221cd1a9..1b64d884 100644 --- a/osinaweb/osinacore/templates/customer_dashboard/pricing.html +++ b/osinaweb/customercore/templates/pricing.html @@ -1,4 +1,4 @@ -{% extends "customer_dashboard/customer_main.html" %} +{% extends "customer_main.html" %} {%load static%} {% block modules_section %} diff --git a/osinaweb/customercore/tests.py b/osinaweb/customercore/tests.py new file mode 100644 index 00000000..7ce503c2 --- /dev/null +++ b/osinaweb/customercore/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/osinaweb/customercore/urls.py b/osinaweb/customercore/urls.py new file mode 100644 index 00000000..c99dda18 --- /dev/null +++ b/osinaweb/customercore/urls.py @@ -0,0 +1,13 @@ +from django.urls import path +from . import views + + +urlpatterns = [ + + path('invoices/', views.customer_invoices, name='customerinvoices'), + path('products/', views.customer_products, name='customerproducts'), + path('pricing/', views.pricing, name='pricing'), + path('initiate_checkout/', views.initiate_checkout, name='initiatecheckout'), + + +] diff --git a/osinaweb/customercore/views.py b/osinaweb/customercore/views.py new file mode 100644 index 00000000..445ee279 --- /dev/null +++ b/osinaweb/customercore/views.py @@ -0,0 +1,79 @@ +from django.shortcuts import render +from django.contrib.auth.decorators import login_required +from django.http import JsonResponse +import requests +from .decorators import * + +# 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 customer_products(request, *args, **kwargs): + + context = { + + } + + return render(request, 'listing_pages/customer-products.html', context) + + +@customer_login_required +def pricing(request, *args, **kwargs): + + context = { + + } + + return render(request, 'pricing.html', context) + + + +@customer_login_required +def initiate_checkout(request): + # Your Mastercard API credentials + api_username = "merchant.TEST06127800" + api_password = "37846250a67c70e7fe9f82cf6ca81f93" + merchant_id = "TEST06127800" + merchant_name = "Ositcom Sal" + + # Data for Initiate Checkout operation + data = { + "apiOperation": "INITIATE_CHECKOUT", + "apiUsername": api_username, + "apiPassword": api_password, + "merchant": merchant_id, + "interaction.operation": "PURCHASE", + "interaction.merchant.name": merchant_name, + "order.id": "123", + "order.amount": "100.00", + "order.currency": "USD", + "order.description": "description_of_order" + } + + + try: + response = requests.post("https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/72", data=data) + + print("Response Content:", response.content.decode()) # Print response content + + 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") + success_indicator = parsed_data.get("successIndicator") + return JsonResponse({"session_id": session_id, "success_indicator": success_indicator}) + else: + print("Response Status Code:", response.status_code) # Print status code + return JsonResponse({"error": "Failed to initiate checkout"}, status=500) + + except Exception as e: + print("Exception:", e) # Print exception traceback + return JsonResponse({"error": "Internal Server Error"}, status=500) \ No newline at end of file diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index a0055b77..9d7b087b 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/osinacore/.DS_Store b/osinaweb/osinacore/.DS_Store index 1e846952..70c987c7 100644 Binary files a/osinaweb/osinacore/.DS_Store and b/osinaweb/osinacore/.DS_Store differ diff --git a/osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc b/osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc new file mode 100644 index 00000000..87de1714 Binary files /dev/null and b/osinaweb/osinacore/__pycache__/decorators.cpython-310.pyc differ diff --git a/osinaweb/osinacore/__pycache__/urls.cpython-310.pyc b/osinaweb/osinacore/__pycache__/urls.cpython-310.pyc index 9a24806e..8c95496c 100644 Binary files a/osinaweb/osinacore/__pycache__/urls.cpython-310.pyc and b/osinaweb/osinacore/__pycache__/urls.cpython-310.pyc differ diff --git a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc index 76e5a3e4..c02a9b86 100644 Binary files a/osinaweb/osinacore/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc index d3c8d4e5..0e555e33 100644 Binary files a/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/add/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/add/views.py b/osinaweb/osinacore/add/views.py index 18ee3ef9..6c0767c5 100644 --- a/osinaweb/osinacore/add/views.py +++ b/osinaweb/osinacore/add/views.py @@ -6,9 +6,10 @@ from django.urls import reverse from django.http import HttpResponseRedirect from datetime import date from django.http import JsonResponse +from osinacore.decorators import * - +@staff_login_required def add_status_modal(request, *args, **kwargs): if request.method == 'POST': text = request.POST.get('text') @@ -36,7 +37,7 @@ def add_status_modal(request, *args, **kwargs): -@login_required +@staff_login_required def add_customer(request): businesses = Business.objects.all().order_by('-id') references = Reference.objects.all().order_by('-id') @@ -89,7 +90,7 @@ def add_customer(request): -@login_required +@staff_login_required def add_business(request): business_types = BusinessType.objects.all().order_by('-id') if request.method == 'POST': @@ -136,7 +137,7 @@ def add_business(request): -@login_required +@staff_login_required def add_business_modal(request): if request.method == 'POST': name = request.POST.get('name') @@ -180,7 +181,7 @@ def add_business_modal(request): return render(request, 'add_templates/addbusiness-modal.html') -@login_required +@staff_login_required def add_staff(request): staffpositions = StaffPosition.objects.all().order_by('-id') if request.method == 'POST': @@ -224,7 +225,7 @@ def add_staff(request): -@login_required +@staff_login_required def add_project(request): staffs = StaffProfile.objects.all().order_by('-id') project_types = ProjectType.objects.all() @@ -279,6 +280,8 @@ def add_project(request): return render(request, 'add_templates/add-project.html', context) + +@staff_login_required def add_user_story_modal(request, project_id): project = get_object_or_404(Project, project_id=project_id) if request.method == 'POST': @@ -305,7 +308,7 @@ def add_user_story_modal(request, project_id): - +@staff_login_required def add_project_note_modal(request, project_id): project = get_object_or_404(Project, project_id=project_id) if request.method == 'POST': @@ -333,7 +336,7 @@ def add_project_note_modal(request, project_id): - +@staff_login_required def add_file_modal(request, *args, **kwargs): context = { @@ -350,7 +353,7 @@ def add_credential_modal(request, *args, **kwargs): -@login_required +@staff_login_required def add_task(request, project_id=None, requirement_id=None): project = None requirement = None @@ -430,7 +433,7 @@ def add_task(request, project_id=None, requirement_id=None): - +@staff_login_required def add_point_modal(request, task_id): task = get_object_or_404(Task, task_id=task_id) if request.method == 'POST': @@ -455,7 +458,7 @@ def add_point_modal(request, task_id): -@login_required +@staff_login_required def add_epic(request, project_id): project = get_object_or_404(Project, project_id=project_id) if request.method == 'POST': @@ -494,7 +497,7 @@ def add_epic(request, project_id): - +@staff_login_required def add_note_modal(request, *args, **kwargs): if request.method == 'POST': text = request.POST.get('note_text') @@ -516,6 +519,7 @@ def add_note_modal(request, *args, **kwargs): +@staff_login_required def add_daily_report(request): user = request.user today = date.today() @@ -546,7 +550,7 @@ def add_daily_report(request): return render(request, 'add_templates/add-daily-report.html', context) - +@staff_login_required def add_projecttype_modal(request, *args, **kwargs): if request.method == 'POST': name = request.POST.get('name') @@ -561,7 +565,7 @@ def add_projecttype_modal(request, *args, **kwargs): return render(request, 'add_templates/add-projecttype-modal.html') - +@staff_login_required def add_staffposition_modal(request): if request.method == 'POST': name = request.POST.get('name') @@ -577,7 +581,7 @@ def add_staffposition_modal(request): return render(request, 'add_templates/add-staffposition-modal.html') - +@staff_login_required def add_businesstype_modal(request, *args, **kwargs): if request.method == 'POST': name = request.POST.get('name') @@ -597,7 +601,7 @@ def add_businesstype_modal(request, *args, **kwargs): - +@staff_login_required def add_reference_modal(request, *args, **kwargs): if request.method == 'POST': name = request.POST.get('name') diff --git a/osinaweb/osinacore/api/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/api/__pycache__/views.cpython-310.pyc index edd06695..99bbfa5a 100644 Binary files a/osinaweb/osinacore/api/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/api/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/decorators.py b/osinaweb/osinacore/decorators.py new file mode 100644 index 00000000..719cda1b --- /dev/null +++ b/osinaweb/osinacore/decorators.py @@ -0,0 +1,13 @@ +from functools import wraps +from django.shortcuts import redirect +from .models import * +def staff_login_required(view_func): + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + # Check if the user is logged in and is a staff member + if not request.user.is_authenticated or not StaffProfile.objects.filter(user=request.user): + return redirect('signout') # Redirect to login URL if not staff + + return view_func(request, *args, **kwargs) + + return _wrapped_view diff --git a/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc index 8922dba1..8af339fb 100644 Binary files a/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/delete/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/delete/views.py b/osinaweb/osinacore/delete/views.py index be206dc1..78549fd9 100644 --- a/osinaweb/osinacore/delete/views.py +++ b/osinaweb/osinacore/delete/views.py @@ -3,9 +3,10 @@ from osinacore.models import * from django.contrib.auth.decorators import login_required from django.urls import reverse from django.http import HttpResponseRedirect +from osinacore.decorators import * -@login_required +@staff_login_required def delete_customer_modal(request, customer_id): customer = get_object_or_404(CustomerProfile, id=customer_id) @@ -19,7 +20,7 @@ def delete_customer_modal(request, customer_id): return render(request, "delete_templates/delete-customer-modal.html", context) -@login_required +@staff_login_required def delete_business_modal(request, business_id): business = get_object_or_404(Business, id=business_id) @@ -32,8 +33,7 @@ def delete_business_modal(request, business_id): } return render(request, "delete_templates/delete-business-modal.html", context) - -@login_required +@staff_login_required def delete_staff_modal(request, staff_id): staff = get_object_or_404(StaffProfile, id=staff_id) @@ -47,7 +47,7 @@ def delete_staff_modal(request, staff_id): return render(request, "delete_templates/delete-staff-modal.html", context) -@login_required +@staff_login_required def delete_project_modal(request, project_id): project = get_object_or_404(Project, id=project_id) @@ -61,7 +61,7 @@ def delete_project_modal(request, project_id): return render(request, "delete_templates/delete-project-modal.html", context) -@login_required +@staff_login_required def delete_project_note_modal(request, note_id): note = get_object_or_404(Note, id=note_id) @@ -80,7 +80,7 @@ def delete_project_note_modal(request, note_id): -@login_required +@staff_login_required def delete_task_modal(request, task_id): task = get_object_or_404(Task, id=task_id) @@ -95,7 +95,7 @@ def delete_task_modal(request, task_id): -@login_required +@staff_login_required def delete_point_modal(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -110,7 +110,7 @@ def delete_point_modal(request, point_id, task_id): -@login_required +@staff_login_required def delete_task_point_modal(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -125,7 +125,7 @@ def delete_task_point_modal(request, point_id, task_id): -@login_required +@staff_login_required def delete_note_modal(request, note_id): note = get_object_or_404(Note, id=note_id) diff --git a/osinaweb/osinacore/edit/__pycache__/views.cpython-310.pyc b/osinaweb/osinacore/edit/__pycache__/views.cpython-310.pyc index 60ebec3c..18161255 100644 Binary files a/osinaweb/osinacore/edit/__pycache__/views.cpython-310.pyc and b/osinaweb/osinacore/edit/__pycache__/views.cpython-310.pyc differ diff --git a/osinaweb/osinacore/edit/views.py b/osinaweb/osinacore/edit/views.py index 41f02212..d6d9690f 100644 --- a/osinaweb/osinacore/edit/views.py +++ b/osinaweb/osinacore/edit/views.py @@ -4,9 +4,10 @@ from django.contrib.auth.decorators import login_required from django.http import HttpResponseRedirect from django.urls import reverse from django.http import HttpResponse +from osinacore.decorators import * -@login_required +@staff_login_required def edit_customer(request, customer_id): customer = get_object_or_404(CustomerProfile, customer_id=customer_id) @@ -60,7 +61,7 @@ def edit_customer(request, customer_id): -@login_required +@staff_login_required def edit_business(request, business_id): business = get_object_or_404(Business, business_id=business_id) business_types = BusinessType.objects.all().order_by('name') @@ -102,7 +103,7 @@ def edit_business(request, business_id): return render(request, 'edit_templates/edit-business.html', context) -@login_required +@staff_login_required def edit_staff(request, staff_id): staff = get_object_or_404(StaffProfile, staff_id=staff_id) positions = StaffPosition.objects.all().order_by('name') @@ -148,7 +149,7 @@ def edit_staff(request, staff_id): -@login_required +@staff_login_required def edit_project(request, project_id): project = get_object_or_404(Project, project_id=project_id) @@ -210,7 +211,7 @@ def edit_project(request, project_id): -@login_required +@staff_login_required def edit_task(request, task_id): task = get_object_or_404(Task, task_id=task_id) projects = Project.objects.all().order_by('-id') @@ -259,7 +260,7 @@ def edit_task(request, task_id): - +@staff_login_required def edit_task_status_modal(request, *, task_id): task = get_object_or_404(Task, task_id=task_id) @@ -280,7 +281,7 @@ def edit_task_status_modal(request, *, task_id): -@login_required +@staff_login_required def edit_epic(request, *args, **kwargs): context = { @@ -290,7 +291,7 @@ def edit_epic(request, *args, **kwargs): -@login_required +@staff_login_required def edit_project_type(request, projecttype_id): projecttype = get_object_or_404(ProjectType, id=projecttype_id) @@ -304,7 +305,7 @@ def edit_project_type(request, projecttype_id): return render(request, 'edit_templates/edit-project-type.html', {'projecttype': projecttype}) -@login_required +@staff_login_required def edit_staff_position(request): context = { @@ -316,7 +317,7 @@ def edit_staff_position(request): -@login_required +@staff_login_required def edit_business_type(request, businesstype_id): businesstype = get_object_or_404(BusinessType, id=businesstype_id) @@ -330,7 +331,7 @@ def edit_business_type(request, businesstype_id): return render(request, 'edit_templates/edit-business-type.html', {'businesstype': businesstype}) -@login_required +@staff_login_required def edit_reference(request, reference_id): reference = get_object_or_404(Reference, id=reference_id) @@ -345,7 +346,7 @@ def edit_reference(request, reference_id): -@login_required +@staff_login_required def edit_tag(request, tag_id): tag = get_object_or_404(Tag, id=tag_id) @@ -368,7 +369,7 @@ def edit_tag(request, tag_id): #Mark points -@login_required +@staff_login_required def mark_point_working_on(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -401,7 +402,7 @@ def mark_point_working_on(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_working_on_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -431,7 +432,7 @@ def mark_point_working_on_task_page(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_paused(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -457,7 +458,7 @@ def mark_point_paused(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_paused_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -483,7 +484,7 @@ def mark_point_paused_task_page(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_completed(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) @@ -524,7 +525,7 @@ def mark_point_completed(request, point_id, task_id): -@login_required +@staff_login_required def mark_point_completed_task_page(request, point_id, task_id): task = get_object_or_404(Task, id=task_id) point = get_object_or_404(Point, id=point_id) diff --git a/osinaweb/osinacore/templates/.DS_Store b/osinaweb/osinacore/templates/.DS_Store index a1d4d95f..97587ba8 100644 Binary files a/osinaweb/osinacore/templates/.DS_Store and b/osinaweb/osinacore/templates/.DS_Store differ diff --git a/osinaweb/osinacore/templates/customer_dashboard/customer_index.html b/osinaweb/osinacore/templates/customer_index.html similarity index 99% rename from osinaweb/osinacore/templates/customer_dashboard/customer_index.html rename to osinaweb/osinacore/templates/customer_index.html index f23628db..5e034347 100644 --- a/osinaweb/osinacore/templates/customer_dashboard/customer_index.html +++ b/osinaweb/osinacore/templates/customer_index.html @@ -1,4 +1,4 @@ -{% extends "customer_dashboard/customer_main.html" %} +{% extends "customer_main.html" %} {%load static%} {% block content %} diff --git a/osinaweb/osinacore/templates/customer_main.html b/osinaweb/osinacore/templates/customer_main.html new file mode 100644 index 00000000..0e47e9f3 --- /dev/null +++ b/osinaweb/osinacore/templates/customer_main.html @@ -0,0 +1,316 @@ +{% load static %} + + + + + + + {% block title %} Osina {% endblock %} + + + + + + + + + +
+ +
+ + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +

My Projects

+
+ +
+ +

Tickets

+
+ +
+ +

Invoices

+
+ +
+ +

Products

+
+ +
+ +

Knowledgebase

+
+ +
+ +

Contact Us

+
+
+
+ + +
+
+
+ Ositcom Logo +

Powered By OSITCOM

+
+

Copyrights © 2024 All Rights Reserved

+
+
+
+ + + + + + + +
+ +
+
+
+
+
+
+
+
+ +
+
+
+ {{ request.user.first_name.0 }}{{ request.user.last_name.0 }} +
+ +
+

{{request.user.first_name}} {{request.user.last_name}}

+ + +
+
+ + + +
+
+ + + +
+ + + + +
+
+
+
+
+ + +
+ + {% block modules_section %} + +
+
+
+
+

Invoices

+ +
+
+

2

+
+
+
+ +
+
+
+

Projects

+ +
+
+

2

+
+
+
+ +
+
+
+

Tickets

+ +
+
+

2

+
+
+
+
+ {% endblock modules_section %} + + + + {% block content %} + replace me + {% endblock content %} + + +
+
+
+ Ositcom Logo +

Powered By OSITCOM

+
+

Copyrights © 2024 All Rights Reserved

+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/osinaweb/osinacore/urls.py b/osinaweb/osinacore/urls.py index b388e61e..f4bdd6ff 100644 --- a/osinaweb/osinacore/urls.py +++ b/osinaweb/osinacore/urls.py @@ -72,12 +72,6 @@ urlpatterns = [ path('add_reaction///', views.add_reaction, name='add_reaction'), - #CUSTOMER DASHBOARD - path('customerdashboard/', views.customer_index, name='customerdashboard'), - path('customerinvoices/', views.customer_invoices, name='customerinvoices'), - path('customerproducts/', views.customer_products, name='customerproducts'), - path('pricing/', views.pricing, name='pricing'), - path('initiate_checkout/', views.initiate_checkout, name='initiatecheckout'), ] urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index 5f02c153..b11e3e0a 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -10,24 +10,26 @@ from django.http import JsonResponse from .models import Task, Epic from django.template.loader import render_to_string from .custom_context import calculate_time_ago -import requests from django.core.validators import validate_email from django.core.exceptions import ValidationError +from django.template.loader import get_template +from .decorators import * def login_with_email(request, email): user = User.objects.filter(email=email).first() if user is not None: - login(request, user) - return redirect('customerdashboard') + login(request, user) + return redirect('home') else: - return render(request, 'lsogin.html') + return render(request, 'login.html') # Pages views def signin(request): if request.user.is_authenticated: - return redirect('home') + if StaffProfile.objects.filter(user=request.user) or CustomerProfile.objects.filter(user=request.user): + return redirect('home') if request.method == 'POST': form = CustomLoginForm(request.POST) @@ -46,10 +48,7 @@ def signin(request): if user is not None: login(request, user) Connection.objects.create(status='Online', date=datetime.now(), user=user) - if CustomerProfile.objects.filter(user=user): - return redirect('customerdashboard') - else: - return redirect('home') + return redirect('home') else: form.add_error(None, 'Invalid email or password. Please try again.') @@ -76,28 +75,36 @@ def go_online(request): + @login_required def home(request, *args, **kwargs): - notes = Note.objects.filter(user=request.user).order_by('-date')[:6] - recent_note = Note.objects.filter(user=request.user).last() + if StaffProfile.objects.filter(user=request.user): + notes = Note.objects.filter(user=request.user).order_by('-date')[:6] + recent_note = Note.objects.filter(user=request.user).last() + if request.user.is_superuser: + # Superadmin can see the last 8 tasks for all users + tasks = Task.objects.filter(Q(status='Open') | Q(status='Working On')).order_by('-status_date', '-id')[:8] + else: + # Non-superadmin user can only see their assigned tasks + tasks = Task.objects.filter(Q(assigned_to=request.user.staffprofile) & (Q(status='Open') | Q(status='Working On'))).order_by('-status_date', '-id') + context = { + 'notes': notes, + 'recent_note': recent_note, + 'tasks': tasks, + } + return render(request, 'index.html', context) + - if request.user.is_superuser: - # Superadmin can see the last 8 tasks for all users - tasks = Task.objects.filter(Q(status='Open') | Q(status='Working On')).order_by('-status_date', '-id')[:8] - else: - # Non-superadmin user can only see their assigned tasks - tasks = Task.objects.filter(Q(assigned_to=request.user.staffprofile) & (Q(status='Open') | Q(status='Working On'))).order_by('-status_date', '-id') + context = { + } + template = get_template('customer_index.html') + return HttpResponse(template.render(context, request)) - context = { - 'notes': notes, - 'recent_note': recent_note, - 'tasks': tasks, - } - return render(request, 'index.html', context) +@staff_login_required def status_mobile_modal (request, *args, **kwargs): context = { @@ -105,7 +112,7 @@ def status_mobile_modal (request, *args, **kwargs): return render(request, 'details_templates/status-on-mobile-modal.html', context) - +@staff_login_required def user_recent_activities_modal(request, user_id): current_time = timezone.now() @@ -135,7 +142,7 @@ def user_recent_activities_modal(request, user_id): -@login_required +@staff_login_required def customers(request, *args, **kwargs): customers = CustomerProfile.objects.all().order_by('-customer_id') @@ -146,7 +153,7 @@ def customers(request, *args, **kwargs): return render(request, 'listing_pages/customers.html', context) -@login_required +@staff_login_required def businesses(request): businesses = Business.objects.all().order_by('-business_id') context = { @@ -155,7 +162,7 @@ def businesses(request): } return render(request, 'listing_pages/businesses.html', context) -@login_required +@staff_login_required def staffs(request): staffs = StaffProfile.objects.all().order_by('-staff_id') @@ -168,8 +175,7 @@ def staffs(request): - -@login_required +@staff_login_required def my_projects(request, *args, **kwargs): user = request.user @@ -210,9 +216,7 @@ def my_projects(request, *args, **kwargs): - - -@login_required +@staff_login_required def my_tasks(request, *args, **kwargs): if request.user.is_superuser: # Superadmin can see all projects @@ -229,7 +233,7 @@ def my_tasks(request, *args, **kwargs): -@login_required +@staff_login_required def my_notes(request): my_notes = Note.objects.filter(user=request.user).order_by('-id') @@ -241,6 +245,8 @@ def my_notes(request): return render(request, 'listing_pages/notes.html', context) + +@staff_login_required def daily_reports(request): user = request.user @@ -256,7 +262,7 @@ def daily_reports(request): -@login_required +@staff_login_required def project_types(request): projecttypes = ProjectType.objects.all().order_by('-id') @@ -267,7 +273,7 @@ def project_types(request): -@login_required +@staff_login_required def staff_positions(request): staffpositions = StaffPosition.objects.all().order_by('-id') @@ -281,7 +287,7 @@ def staff_positions(request): return render(request, 'listing_pages/staff-positions.html', context) -@login_required +@staff_login_required def business_types(request): businesstypes = BusinessType.objects.all().order_by('-id') @@ -291,7 +297,7 @@ def business_types(request): return render(request, 'listing_pages/business-types.html', context) -@login_required +@staff_login_required def references(request): references = Reference.objects.all().order_by('-id') @@ -303,7 +309,7 @@ def references(request): return render(request, 'listing_pages/references.html', context) -@login_required +@staff_login_required def tags(request): tags = Tag.objects.all().order_by('-id') @@ -322,7 +328,7 @@ def tags(request): #Details -@login_required +@staff_login_required def customerdetails(request, customer_id): customer = get_object_or_404(CustomerProfile, customer_id=customer_id) context = { @@ -331,7 +337,7 @@ def customerdetails(request, customer_id): } return render(request, 'details_templates/customer-details.html', context) -@login_required +@staff_login_required def businessdetails(request, business_id): business = get_object_or_404(Business, business_id=business_id) context = { @@ -340,7 +346,7 @@ def businessdetails(request, business_id): } return render(request, 'details_templates/business-details.html', context) -@login_required +@staff_login_required def staffdetails( request, staff_id): staff = get_object_or_404(StaffProfile, staff_id=staff_id) @@ -350,7 +356,7 @@ def staffdetails( request, staff_id): return render(request, 'details_templates/staff-details.html', context) -@login_required +@staff_login_required def taskdetails(request, task_id): task = get_object_or_404(Task, task_id=task_id) points = Point.objects.filter(task=task).order_by('-id') @@ -364,6 +370,7 @@ def taskdetails(request, task_id): return render(request, 'details_templates/task-details.html', context) +@staff_login_required def show_points_modal(request, task_id): task = get_object_or_404(Task, task_id=task_id) points = Point.objects.filter(task=task).order_by('-id') @@ -375,9 +382,7 @@ def show_points_modal(request, task_id): return render(request, 'details_templates/showpoints-modal.html', context) - - - +@staff_login_required def timeline_modal(request, task_id): task = Task.objects.get(task_id=task_id) point_activities = PointActivity.objects.filter(point__task=task) @@ -412,7 +417,7 @@ def timeline_modal(request, task_id): -@login_required +@staff_login_required def projectdetails(request, project_id): project = get_object_or_404(Project, project_id=project_id) epics = Epic.objects.filter(project=project).order_by('-id') @@ -439,6 +444,7 @@ def projectdetails(request, project_id): #FETCH EPIC RELATED TASKS +@staff_login_required def get_tasks(request, epic_id): epic = get_object_or_404(Epic, id=epic_id) related_tasks = Task.objects.filter(epic=epic).order_by('-id') @@ -452,6 +458,7 @@ def get_tasks(request, epic_id): # TO DISPALY ALL THE OPEN TASKS OF THIS PROJECT +@staff_login_required def open_tasks_for_project(request, project_id): project = Project.objects.get(pk=project_id) open_tasks = Task.objects.filter(project=project, status='Open').order_by('-id') @@ -466,6 +473,7 @@ def open_tasks_for_project(request, project_id): # TO FETCH THE EPICS OF THE SELECTED PROJECT WHEN EDITING A TASK +@staff_login_required def fetch_epics(request): project_id = request.GET.get('project_id') epics = Epic.objects.filter(project_id=project_id).values('id', 'title') @@ -474,6 +482,7 @@ def fetch_epics(request): # TO UPDATE THE STATUS CONTAINER +@staff_login_required def get_updated_last_status(request): if request.user.is_authenticated: last_status = Status.objects.filter(staff=request.user.staffprofile).last() @@ -507,6 +516,7 @@ def get_updated_last_status(request): # TO GET USER ACTIVITIES +@staff_login_required def get_latest_activities(request): latest_connections = Connection.objects.filter( user__staffprofile__isnull=False @@ -555,6 +565,7 @@ def get_latest_activities(request): return HttpResponse(recent_activities) +@staff_login_required def recent_activities_page(request): context = { @@ -564,6 +575,7 @@ def recent_activities_page(request): return render(request, 'recent-activities-page.html', context) +@staff_login_required def add_reaction(request, status_id, emoji): status = get_object_or_404(Status, pk=status_id) user = request.user @@ -577,112 +589,3 @@ def add_reaction(request, status_id, emoji): # If the user hasn't reacted yet, create a new reaction new_reaction = Reaction.objects.create(status=status, emoji=emoji, user=user) return JsonResponse({'message': 'Reaction added successfully.'}) - - - - - - - - - - - - - -# CUSTOMER DASHBOARD -# LISTING PAGES - - -@login_required -def customer_index(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/customer_index.html', context) - - -@login_required -def customer_invoices(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing_pages/customer-invoices.html', context) - - -@login_required -def customer_products(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing/customer-products.html', context) - - -@login_required -def pricing(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/pricing.html', context) - - - -@login_required -def customer_products(request, *args, **kwargs): - - context = { - - } - - return render(request, 'customer_dashboard/listing/payment.html', context) - - - -def initiate_checkout(request): - # Your Mastercard API credentials - api_username = "merchant.TEST06127800" - api_password = "37846250a67c70e7fe9f82cf6ca81f93" - merchant_id = "TEST06127800" - merchant_name = "Ositcom Sal" - - # Data for Initiate Checkout operation - data = { - "apiOperation": "INITIATE_CHECKOUT", - "apiUsername": api_username, - "apiPassword": api_password, - "merchant": merchant_id, - "interaction.operation": "PURCHASE", - "interaction.merchant.name": merchant_name, - "order.id": "123", - "order.amount": "100.00", - "order.currency": "USD", - "order.description": "description_of_order" - } - - - try: - response = requests.post("https://creditlibanais-netcommerce.gateway.mastercard.com/api/nvp/version/72", data=data) - - print("Response Content:", response.content.decode()) # Print response content - - 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") - success_indicator = parsed_data.get("successIndicator") - return JsonResponse({"session_id": session_id, "success_indicator": success_indicator}) - else: - print("Response Status Code:", response.status_code) # Print status code - return JsonResponse({"error": "Failed to initiate checkout"}, status=500) - - except Exception as e: - print("Exception:", e) # Print exception traceback - return JsonResponse({"error": "Internal Server Error"}, status=500) \ No newline at end of file diff --git a/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc index c485ea2b..60710cff 100644 Binary files a/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc and b/osinaweb/osinaweb/__pycache__/settings.cpython-310.pyc differ diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc index 8fe701a3..e0e62148 100644 Binary files a/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc and b/osinaweb/osinaweb/__pycache__/urls.cpython-310.pyc differ diff --git a/osinaweb/osinaweb/settings.py b/osinaweb/osinaweb/settings.py index edb6be34..e04fa8cf 100644 --- a/osinaweb/osinaweb/settings.py +++ b/osinaweb/osinaweb/settings.py @@ -42,6 +42,7 @@ LOGIN_URL = 'signin' INSTALLED_APPS = [ 'rest_framework', 'osinacore', + 'customercore', 'addressbook', 'billing', 'colorfield', @@ -68,7 +69,10 @@ ROOT_URLCONF = 'osinaweb.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'osinacore', 'templates'),], + 'DIRS': [ + os.path.join(BASE_DIR, 'osinacore', 'templates'), + os.path.join(BASE_DIR, 'customercore', 'templates'), + ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ diff --git a/osinaweb/osinaweb/urls.py b/osinaweb/osinaweb/urls.py index 796d3fff..987e8767 100644 --- a/osinaweb/osinaweb/urls.py +++ b/osinaweb/osinaweb/urls.py @@ -21,6 +21,7 @@ from django.conf import settings urlpatterns = [ # Pages urls path('', include('osinacore.urls')), + path('', include('customercore.urls')), path('', include('billing.urls')), path('admin/', admin.site.urls),