From 4c7d45ea1f213f391980737418f69570fa0974c9 Mon Sep 17 00:00:00 2001
From: nataly
Date: Wed, 29 May 2024 15:14:22 +0300
Subject: [PATCH] New changes.
---
.../add/__pycache__/urls.cpython-312.pyc | Bin 1070 -> 1070 bytes
.../add/__pycache__/views.cpython-312.pyc | Bin 12211 -> 8335 bytes
osinaweb/billing/add/urls.py | 4 +-
osinaweb/billing/add/views.py | 111 +----------
.../__pycache__/urls.cpython-312.pyc | Bin 2244 -> 2675 bytes
.../__pycache__/views.cpython-312.pyc | Bin 11194 -> 13609 bytes
.../payment/__pycache__/views.cpython-312.pyc | Bin 14939 -> 15126 bytes
.../listing_pages/customer-invoices.html | 3 +-
.../user_profile_pages/user-profile.html | 91 +++++++++
.../user_profile_pages/user-settings.html | 90 +++++++++
osinaweb/customercore/urls.py | 8 +
osinaweb/customercore/views.py | 61 ++++++
osinaweb/db.sqlite3 | Bin 1355776 -> 1359872 bytes
.../__pycache__/admin.cpython-312.pyc | Bin 3451 -> 3538 bytes
.../__pycache__/models.cpython-312.pyc | Bin 23840 -> 25897 bytes
.../__pycache__/views.cpython-312.pyc | Bin 40555 -> 41311 bytes
.../edit/__pycache__/urls.cpython-312.pyc | Bin 2998 -> 3121 bytes
.../edit/__pycache__/views.cpython-312.pyc | Bin 26794 -> 27579 bytes
.../0082_pinnedproject.cpython-312.pyc | Bin 0 -> 1499 bytes
.../osinacore/templates/customer_main.html | 24 ++-
.../details_templates/customer-details.html | 7 +
osinaweb/osinacore/templates/main.html | 2 +-
.../templates/projects-by-status.html | 23 +--
osinaweb/static/dist/output.css | 175 ++++++------------
.../ositcom_logos/full-logo-blue-bg.png | Bin 0 -> 28648 bytes
.../js/customer_dashboard/change-password.js | 93 ++++++++++
26 files changed, 445 insertions(+), 247 deletions(-)
create mode 100644 osinaweb/customercore/templates/user_profile_pages/user-profile.html
create mode 100644 osinaweb/customercore/templates/user_profile_pages/user-settings.html
create mode 100644 osinaweb/osinacore/migrations/__pycache__/0082_pinnedproject.cpython-312.pyc
create mode 100644 osinaweb/static/images/ositcom_logos/full-logo-blue-bg.png
create mode 100644 osinaweb/static/js/customer_dashboard/change-password.js
diff --git a/osinaweb/billing/add/__pycache__/urls.cpython-312.pyc b/osinaweb/billing/add/__pycache__/urls.cpython-312.pyc
index fa3eb0f8b4da098a68da1717de5879e1f409666d..1928ca12f0db0556dc7a2a94ddf10971a6d03023 100644
GIT binary patch
delta 33
mcmZ3-v5tfHG%qg~0}vei6P7l6Bd<6M7cW0kBX^NFPz(T-i3gJa
delta 33
mcmZ3-v5tfHG%qg~0}vdP3Q3!@kyo6Bi;thFk-JD7Cz)1D`|&>}PVkOlZ4xPgC~-^@>_K!T{@%!xyk;~qF8j*&Q{7UBXz;(|cpgg8*I#xb*Iq@wNukX<1=6S61C
z&W7wMvU4GO`XFKEf5TN~R41gPu8H2@JMmSdlqa7o0LB3&Kv}&PYl@uuDYjmnhT}L$
zr(NG^TmHemW4Vo?l#Teu!W=w~M`9wYz8@>sbHka*de8H_ZAZ!pY=mwjQ;*(p3hbCd=a28PT(8q>wYUPEe7onl9mn%@tYQ0(84Z#zP?o%?
z{>p8Nn!21{Uwe)mI(hvlm?hE)Qp2YnaP4Vi3@fAK+pph*TG6S{R)`lmd$~22prRZVf&x*pTGs@j21w0eJx@
zT>-2Sm`12)H{jg>aND_sn=o$@=$L2UcY>CJznKVH`U(QLAaIhG0Iw2w34#UwB-1LY
zez7FB)tAK%5sH;w6N@}JS!Cd)=(yXq??Lxtmwa9M<@&9YT5i6)wQ)xqx9x+r)A4uc
z)yP{oB?(|%M^DaM_{g)B1yNO-m3gtNoXQtsSskXQ1{0I%Xr3kFSmstzt24D{xF&wV
zZ{mVIz+J!_1oU3s!WuyzoKX+UGyQJEZmqoIw_9dDP?v?>LDcYjIx!^jB?{4Lo|L27
zg1RucI!bK~RhS7XWaXJ4vjEGq4AE4z+2sqY-x6(k8G@iGM;P>`fRWh`espV#}_G0@&OS(KvvcM{3%gapU+nl%j7a=)F-tc_KKcwH=9E{257z
I9l;6z0@@rrmH+?%
delta 5036
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/', views.add_order, name='addorder'),
- path('invoice-pdf//', views.add_invoice_pdf, name='addinvoice'),
- path('payment-pdf//', views.add_payment_pdf, name='addpayment'),
+
path('service///', views.add_service_in_order, name='addserviceinorder'),
@@ -16,5 +15,4 @@ urlpatterns = [
path('payment//', views.add_payment_modal, name='add_payment_modal'),
path('payment_comment/', views.add_payment_comment_modal, name='add_payment_comment_modal'),
-
]
diff --git a/osinaweb/billing/add/views.py b/osinaweb/billing/add/views.py
index c1b41a70..1c79925c 100644
--- a/osinaweb/billing/add/views.py
+++ b/osinaweb/billing/add/views.py
@@ -8,7 +8,7 @@ import os
from osinacore.decorators import *
from django.core.files.base import ContentFile
from django.db.models import Q
-from weasyprint import HTML, CSS
+
@staff_login_required
@@ -211,116 +211,7 @@ def add_payment_comment_modal(request):
-def add_invoice_pdf(request, order_id):
- order = get_object_or_404(Order, id=order_id)
-
- current_year = str(timezone.now().year)[-2:]
- last_invoice = Invoice.objects.all().last()
- if last_invoice:
- last_invoice_number = int(last_invoice.invoice_number.split('-')[1].split('+')[0])
- new_invoice_number = f"$0{current_year}-{last_invoice_number + 1}"
- else:
- new_invoice_number = f"$0{current_year}-1425"
-
-
-
- invoice = Invoice.objects.create(
- invoice_number = new_invoice_number,
- order=order,
- date_created=datetime.now(),
- )
-
- template = get_template('details_templates/invoice-details.html')
- context = {'order': order}
- html_string = template.render(context)
-
- # Define the CSS string with Poppins font
- css_string = '''
- @font-face {
- font-family: 'Poppins';
- src: url('path_to_poppins_font_file.ttf') format('truetype'); /* Update the path to the font file */
- }
-
- body {
- font-family: 'Poppins', sans-serif; /* Use Poppins font for the entire document */
- }
-
- /* Your existing CSS styles */
- /* Add or modify styles as needed */
- '''
-
- # Generate PDF
- pdf = HTML(string=html_string).write_pdf(
- stylesheets=[
- CSS(string=css_string),
- CSS(string='@page { margin: 30px; }')
- ],
- presentational_hints=True
- )
-
- filename = f'invoice_{invoice.invoice_number}.pdf'
- pdf_content = ContentFile(pdf)
- invoice.pdf.save(filename, pdf_content, save=True)
-
-
- # Return PDF
- response = HttpResponse(pdf, content_type='application/pdf')
- response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"'
- return response
-
-
-
-
-
-
-
-def add_payment_pdf(request, order_id):
- order = get_object_or_404(Order, id=order_id)
- payments = OrderPayment.objects.filter(order = order)
- paid_amount = OrderPayment.objects.filter(order=order, date_paid__isnull=False).aggregate(total_paid=Sum('amount'))['total_paid'] or 0
- cart_total = order.get_cart_total
- remaining_amount = cart_total - paid_amount
-
-
- invoice = order.invoice
-
- # Render both invoice and payment details templates to HTML
- invoice_template = get_template('details_templates/invoice-details.html')
- payment_template = get_template('details_templates/payment-details.html')
- invoice_html = invoice_template.render({'order': order})
- payment_html = payment_template.render({'order': order, 'payments':payments, 'remaining_amount':remaining_amount,})
-
- # Combine the HTML content of both templates
- combined_html = f"{invoice_html}{payment_html}"
-
- # Define CSS
- css_string = '''
- @font-face {
- font-family: 'Poppins';
- src: url('path_to_poppins_font_file.ttf') format('truetype'); /* Update the path to the font file */
- }
-
- body {
- font-family: 'Poppins', sans-serif; /* Use Poppins font for the entire document */
- }
-
- /* Your existing CSS styles */
- /* Add or modify styles as needed */
- '''
-
- # Generate PDF
- pdf = HTML(string=combined_html).write_pdf(
- stylesheets=[
- CSS(string=css_string),
- CSS(string='@page { margin: 30px; }')
- ],
- presentational_hints=True
- )
- # Return PDF
- response = HttpResponse(pdf, content_type='application/pdf')
- response['Content-Disposition'] = 'attachment; filename="my_pdf.pdf"'
- return response
diff --git a/osinaweb/customercore/__pycache__/urls.cpython-312.pyc b/osinaweb/customercore/__pycache__/urls.cpython-312.pyc
index 4199a25274cf65b920b16292adb51dcd8cfefd86..bd22ffbe16b3cf9dcc5c84e6b750c63683602a0e 100644
GIT binary patch
delta 538
zcmX>i_*q2bG%qg~0}z}S4Np^KXJB{?;=q6;l<_%)d85V#rg|oZRK^tbRF*6amA++Wbczm|I^9%FmMlGl0vIbr51}w!G)kgU
zU(;ao1E#f1^;Nv3#i>QQ1x5L3nK`NYx41!ED6fhSELWUbQj(dMUaWtM2gHYQtN4>M
z67$ki3lfWq%kzs;^l$N@3RHgeIiZSLR2Lmf-hx`oH>ry%w
zrF1sfUSV;($-;4gQ*wssb!oke(s~=>uCTZ~1PMvaaJ?>Lcu~gif`!Kw7EiD;r3J3n
cRU9s=I9za#zrvF6!Ie>&pQ(|%$Pj1;04>0flmGw#
delta 105
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
delta 2012
zcmZuyT}&KR6yDiC7T8~4ciCkJ7D{24B31rOnhO5#07#)xT9jJHVQ0{RWtX0rwUQXO
z(Q2zrqj=l;K#b8hG(PCs2Q?;Y;*+K!@xf$6Vjt886OE01u~FkWcVL;W-DEz_ckcPS
z=iYnRT>5Oz|EDUVok)u04vST&x{&2)*n(?_I(myXAen
z72M5oz69D{@O4b_f(FnO1_?&U$!}Jzp_im7I*gLiQ|ZF}WXS8S
zMTwVdmdyV0C0ygEd$1JuOG4$`m>mwWRB-e}l02y~Q0bZ37*};;Cdr8BaG}I=n0ICG
zbg`Z#yfZpXp~W2gI!LD*2z}D?F!}O+JI%1uq?jS#5%(@1`z_S!I*JP!7Hqf|n>gO^
zgIzepl3@d{+U4+*ok{Y#z2dS*&gJrkY^Y_&5&1dnW;8M)jIra9p?b^lvMZ4>_dL0u
zVAmtD`xZ%jjDQzG4}x!N7j~XP<-`pwv#jFovS@g!G#p*VewN;AZg;lxApGXgRVaHv
zl{1Ex&jGb6Ex;1{DbW!>M#OGrq;Ai`9BCZ5oD@%XJb{FtLOH1El3XyJQFE9QcclQ2
z-ND`w+k#0l4k+;1r^pnr$u*RRl(F?kU8&<2c_Fv6Rm2Eq^O3hWp#J~O*inA5xnpl0Vx8
zksaK3wfGQ4OcL-1=~~o4H{bzMRNcY4>O1%{8NEVqj^I4Os|2qR@G7YZyH)N!S|1Lv
z6*X6oR{I4TsGaHo&4(=?crZ>2^vZ$WDt{6D(0Ob5R)MwvR0~j!O*1%uQnx&ZS8#l1)e(3X
rmjwLuV~Bq^1VQ-GHoR?%ZQBytwl?Hx)x6oJI#)q>KSRoNc1GA3^3el)ik)%i<~)f@jEwc09i`-W8Bc6ZP(R4ds5x0l|2OMtpl-I!N(P@;`Dz$e
zGXi-)5X_({I$6nVK3L5pky`>qsVSL7smUer`Nf&ZiA5B&s8;Q{IrP2mNSVkvw;QhejDTa1i+o3AqYFtUmQ%_yEM
z&8j)spXE5C{A6*~FO1rodDz(47!x)N^XM_Ln}Sp{GENSZvfA9lcZ-QJcXOll1uojgyEf3mLGJf5OeK(V5e
zAmY^Izxt~D$%#cNMdyKhQ%0cq`!_E$-@!Qfr6E6)ro`kt%Z|xhR!)p(Ci_~+b6p22
Y0;*vso;tbAN^|let2{QfB4MBa0Q#R&=l}o!
diff --git a/osinaweb/customercore/templates/listing_pages/customer-invoices.html b/osinaweb/customercore/templates/listing_pages/customer-invoices.html
index b7702622..7ea4ce9c 100644
--- a/osinaweb/customercore/templates/listing_pages/customer-invoices.html
+++ b/osinaweb/customercore/templates/listing_pages/customer-invoices.html
@@ -51,7 +51,8 @@
{{invoice.order.orderpayment_set.all.last.date_due}}
{% else %}
-
- {% endif %}
+ {% endif %}
+
diff --git a/osinaweb/customercore/templates/user_profile_pages/user-profile.html b/osinaweb/customercore/templates/user_profile_pages/user-profile.html
new file mode 100644
index 00000000..fe40a080
--- /dev/null
+++ b/osinaweb/customercore/templates/user_profile_pages/user-profile.html
@@ -0,0 +1,91 @@
+{% extends "customer_main.html" %}
+{%load static%}
+{% block content %}
+
+
+
+
+
+ 
+
+
+
+ {{request.user.first_name}} {{request.user.last_name}}
+ {{request.user.email}}
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/osinaweb/customercore/templates/user_profile_pages/user-settings.html b/osinaweb/customercore/templates/user_profile_pages/user-settings.html
new file mode 100644
index 00000000..5bb372f7
--- /dev/null
+++ b/osinaweb/customercore/templates/user_profile_pages/user-settings.html
@@ -0,0 +1,90 @@
+{% extends "customer_main.html" %}
+{%load static%}
+{% block content %}
+
+
+
+
+
+ 
+
+
+
+ {{request.user.first_name}} {{request.user.last_name}}
+ {{request.user.email}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/osinaweb/customercore/urls.py b/osinaweb/customercore/urls.py
index 290267c5..fef96de9 100644
--- a/osinaweb/customercore/urls.py
+++ b/osinaweb/customercore/urls.py
@@ -29,4 +29,12 @@ urlpatterns = [
path('shared-hosting-plans/', views.shared_hosting_plans, name='sharedhostingplans'),
path('cloud-vps-hosting-plans/', views.cloud_vps_hosting_plans, name='cloudvpshostingplans'),
path('dedicated-servers-plans/', views.dedicated_servers_plans, name='dedicatedserversplans'),
+
+
+ # USER PROFILE
+ path('user-profile/', views.user_profile, name='userprofile'),
+ path('user-settings/', views.user_settings, name='usersettings'),
+
+ path('changepassword/', views.change_password, name="changepassword"),
+ path('check_current_password/', views.check_current_password, name='check_current_password'),
]
diff --git a/osinaweb/customercore/views.py b/osinaweb/customercore/views.py
index 90978f35..1fcf363e 100644
--- a/osinaweb/customercore/views.py
+++ b/osinaweb/customercore/views.py
@@ -7,6 +7,9 @@ from django.db.models import Q
from django.http import Http404
from django.db.models import OuterRef, Subquery
from customercore.views import *
+from django.contrib.auth.hashers import check_password
+from django.contrib.auth import update_session_auth_hash, logout
+import json
@@ -264,3 +267,61 @@ def dedicated_servers_plans(request, *args, **kwargs):
+# USER PROFILE
+@customer_login_required
+def user_profile(request, *args, **kwargs):
+
+ context = {
+
+ }
+
+ return render(request, 'user_profile_pages/user-profile.html', context)
+
+
+
+@customer_login_required
+def user_settings(request, *args, **kwargs):
+
+ context = {
+
+ }
+
+ return render(request, 'user_profile_pages/user-settings.html', context)
+
+
+
+
+def change_password(request):
+ if request.method == 'POST':
+ current_password = request.POST['current_password']
+ new_password = request.POST['new_password']
+ confirm_password = request.POST['confirm_password']
+
+ if check_password(current_password, request.user.password):
+ if new_password == confirm_password:
+ request.user.set_password(new_password)
+ request.user.save()
+ update_session_auth_hash(request, request.user)
+ logout(request)
+ return redirect('home')
+
+ return render(request, 'accounts/change_password.html')
+
+
+
+def check_current_password(request):
+ if request.method == 'POST':
+ try:
+ data = json.loads(request.body.decode('utf-8'))
+ current_password = data.get('current_password')
+ except json.JSONDecodeError:
+ return JsonResponse({'is_current_password_correct': False})
+
+ user = request.user
+
+ if check_password(current_password, request.user.password):
+ return JsonResponse({'is_current_password_correct': True})
+ else:
+ return JsonResponse({'is_current_password_correct': False})
+
+ return JsonResponse({'error': 'Invalid request method'}, status=400)
\ No newline at end of file
diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3
index 9e91a1175d139f5004045589ca3fa44e06578384..bb6f86a79532224bc109e1c5e570b3f2f3c89c31 100644
GIT binary patch
delta 2198
zcmah}TWlO>6`q~hOYQaU_!a?5QSBzS>V|dZep#sxv%B7l_kQ0sRqUCaz0Th6vw(bw
zArh#qlS(WPRg+MGL?4ilO9oLMETr;)K&dJ&rBHCF3Kc{I)IilpRhV@EJG|tVz8UF1
z|2gOXzw@25br{*&ite2@Z3BSD_W*$A@>8^K8(8js^?Tws&S?_+pPZY9G}rbg&;OYg
zX$(=<*-(q~mNN(&5M@V<3sqcb7wySsg+iQ+)X|c#8V{WFCj|@(_K2p~p@J^PS#bAJ
zL`)&)If;<{&tM2fSP;^Jv2!S5#VIRFFOww7qQw5^^UoUon~BKS{c@v7lMTUL4GtR3
zLN{M8oE6wq%~y}avq3J(d4!b#ANC=gI)093YoTF
z{=MlV(;Ldhb=_<3sp1{Jt`I
zF!oE>pocWz5^(L(?VDpN#+BPQji27rTo~#$CSKRWTkrMttA-M4b#DNbkNm)>A4m~D@WoQJr_5b$c5>Yro0fztp%$@XC?f8gTio|FV1O9O7
zpf;f#)J%>#B`d-EuYXVfJ9T^Sk0w(4;=$Y6&sxER4jKc&
z_~=PiF!taVJ=%*XfB%zd_B+tC;FY0a&-{!TyaN5$c-{C#W73F%KNtq~%vDgkw$Huw
zs%CQm@`F4(ph`5`$TdovoSuE9aq#zM>aZnXR;MV9AnG*y?Xy*EIq0i(xgA!6}
zAp*e<1fraiDD{z}Q&bs~aDvX2dc9s#YIiz(u8nqt3e}_-dQkaKtW1H&n~ipxQT}?x
z{96kuK69)zW(RBZ)-0?7eHp*F*dK7
zhVuych2hH^GXn*BYIa_uu)@rHdL3ZU`FE5vOS5M+%9YQ}KB*bod2)M2=f4=`hW~iQ
zJg4kQGws(Np8yeP+-82)q)a?-EE+x>dtCoh-M6$`P#Q#3Mkc|{orP^)bxU)Ps@`&T
zwVxu#}*)clnUStl8mwj*>p*`+#Zz@g
z(j2j#;%!7Jl*nZ{H=1j;2y~EI3)kg{CE5>ED?(7fI=1yz)fO%}O$BxG^6qt37$?PogOj37IE*?1|@j<*{LMr7NPOdu68nengt
zlU%kP?XgYS?MX|%mNy&>VaZacQy(Fu&8?>Zaqas85nYWv1SC6fH-J
z#CfY_H4t=Hyq=gZ=1HI=Q;((#-4tG<>|Nhd%1y|{Djjx3^Q|!JKS}$MA~9;2rCEd^
F{|)0NuFU`d
delta 836
zcmYL`O=uHA6vt(GoqVNNFopiV>|75gho<(xe-g}u$d#1QI
zw?^m&fNBE&-smQs=?1Q@#-}~EoK#!km$MR5V+G5WPkKHwz#Z{kh&1nM?GJV)29hWJ
z%|prFU?|a38;B`wgN^Z2(Am&&vbitZ(a@%)&z#*A>kgln+tae%-9i?_?tW)RX&~6PF)z>)gL~U_NTN!?T~lS
zACIJ3wDi9E{XHGQ)~2T3{X=oJrz@!R_Jxw6eIaLaXE<@-OyGZv?ohlwx9(HjE=AY2
z%6ef33oQ%0gq8J|iVSX)sxv$HRa1Rl@6G_A@}hY=GsKSRHx
zW*;s^%>k1E062`UEK=Q={Z6fh*{Qf0PsN4Z3E0anV6G_KpwR92LJ8mgAgG3XBg%wMf6y;;xG^}u}H
z)WYOJXM>}&CzfK4$z
zXt>4{;Bk68wUV6wJI>VFzp&*VB&WK+{0}(ojWpiri@aPSj;EqvOJ#b#i-4wu-T3E
z7Yn1}WJj*!e7pgfd3mWR0Y&*)smUdi*}407$@8C3Qa!81H)?p
D;vFEy
delta 89
zcmca4{acFnG%qg~0}yygg``cL$ScXHu~GddGfOJxYNp8nOva2-lN}gMC+D&}-rUCe
lfrU|Fayi%W$-dluT#i6Zj6hs`dGk|lF2>2Kyh2dC764Zm7>@t|
diff --git a/osinaweb/osinacore/__pycache__/models.cpython-312.pyc b/osinaweb/osinacore/__pycache__/models.cpython-312.pyc
index a959616eca5ba262d28b5eba539e23a602ab1914..9f2d29f675e33eafaf3282051a549933fe1eecb5 100644
GIT binary patch
delta 3317
zcmZWr3v5%@8NTPncH&3kBscGO2uUz0!A(LMLI?$tKuAbJUJzc!jc=HPW1DktI*6P>
zE7Y-xtz>5s(!`{8(*y|AhI(pY&;p&dsVf`4gwBzng03ACNF9Vmlvb_S{~rek^vd`1
zIsfbY=YO1Y-}n9{1ecaxjLGd6(elir
zgZ~(KzuE?HNKo0^=G?i1dYC-(1V}(QL5|Pp4#u*v>pLAGJQ?NMbKG03~zimDtFX&R8Zs)AMv3TQgY8QqG*&(%kgW(<@+
zCjA~Hlv04b!ZmA7bJ#jpv(61$%QS1*c*-d?WG$PpHiWG$nzd!Zx;7NImS%zQQ#;1J
z@g0{C+_8&{iUGpL^eH0EVy~}F69@IUH_=;+Gj_2#1^MfWQ?gEo$3X?3(U?F?gRli0
z8Px@JgJvF#&0uv@KWZ3_4Tu4~D`o^%3K(2E{2u|OKrG@&JV=QLY&szzf(-0@RL@5S
zK>%5t8(^**fjM}l58zCHI0iy(XrmY?8;O{misIf55q7A)TZsvRaH~#m11Bb;|B-K)
zDv{VBw|7{TVW7zUKCer$86p;lqB884>97K6h*O=)4u>MEkr=1PLyv*sh(%GI0|Sso
zNR=G1sy@}}ad0`+JtW)WW-`V;ZOAkuS&8WIkCil*?1`k$h=U}U<%@D%B@Rp%%skN)
zC(RQ5v5)SMT_c%~QvCzgA3$CCE5Kf1GB+<2mo-^h7A~#1Tv~HbcPM@=KAc#nB^K_v
zl2~-gb#CbNP`JKRtM3ds`oj*t=J1E=J16RQ?$_T)$-F0sMoRWKOtyA}TeoSg+a_9H
z(k#s(OHL@y9;#@bwB&_~D#u+~QEh11x=?qowyam1vp%$Or#5G&W`SScT|Jt(8z>>DvdpCOs%4z2gxaa2a3XE2th1RQ>
zUH-6B&GQm?zs(ffppi|LOYCruS&UYjrAv5PTo(|~P-}|igzj;dKC6Wdt8cRrdIXk<
z7*=|GitK{vR+vH?BbB~|<5>Dfl+blUdU^Xs3nW(F)$bX0$q{|OZ`iBS_fX+Dz*8NZ
z==00oXzm?cZX{zSyL-x?Wxb2a6acbowua3)m(4lXr1V2|V|8JvM3YL6sv)UlLaGW&
zb(&OnesxHyn~>Iqr7lhCnvi-zmYy%37C)a7Uf!uK@8oJ-VQG^lZ3^}82uYhJq!dqB
zqMAe}BsFAFd1h?+?6Vj0n62!$<`cM^a|nN7*PAlg)v^Ra*i=R)i+S#oylGvWzVco&
z(YKL%x&Qa5%HFK}HM!1xX|Fm!$Q^cVQ8l@ZTI2{Tt*$olMG$VY?bSYVlZW7L^*_mf*|`^X
zfDlB~`Xw4f_zGU7i=EHOU~)|Z`I1Zjx#nLW{hP&Gqtd1+lt%c5rPXdDQ|wM+X7FI`
zVq!s`;V6}Nsq_kat1mYh?TQ}5RK#U=DZ
z;NJQc1u?eW^rwJOEH~iqnE0(}Jsh`g@AiUrFZ~`!^xp`J5IzsSwCt=%9oWd5DFj_ohaTw8jfCsFjCN)^F%1R&z_SF~3*X;Y%
z>2oDq@;i`*CN^|9;RMoR(vq&{F>yKBsCKDw>7z>f&FLA=@wqq4{#|Slsp{qa(Cc}?}GRI8Jrr?uR7!o;oNy8?y@L=0UFdS_8N87BJ&UibXWGcDkF+C_|H&cUWbtz)gz0t~0KM6!}RBH(!1!d~2b
F6huV8QTeg_NL@pApX^)ReC&h!9*$H~
zO@AadHRYU|{;(|n@DG|w;pzB0vz)O>$7#$`pN{6#)Q}_k2iAm=opV>q9o~m~&-tGF
z&O7(qJNO;@O!$hl+xBd;dcJBJ&ITVILcZr3FP0SmHMi
z&D_JB1JYKuF0W1UyUqThvq><`=6Vk}<{zK659fn6D|MOH-J>do65+$7n2Yd}S&nxps)}Y4Zq2VvwNiSx
z_JY!7Kv`+Ab1z8=dmvu=9NTNM1+Ou72wpEQa~vh#AbeTw%iK@HX@t)RpTlUm$9a&3
zgki{B*vk$ATi`W!E}X`mIz%29!f(UO?9Dw&oS(!gP8`crO~+)ufh&uG>GYswbz3G#<;~1i1*u;7Y}N>;z_@KvmuB;l
z6($<;p}05)e2sIVx%lZB`Xto(9{zYPPAr$98L}EOFvE}$>sFw*F^8qWK;wCb*o_kq
zZkqDy0ZN8~`3k~sgsliGnd%@v+(WWH)k4
z1ch89C-!DQ?xWuPhipTHM3HH<4Z>@@W}tJ4BaXhFxtQxA=-6En=s#^HI^8_h}hI
z9)2*KnW(jANU843<`rAv!Pba-j)Mz$D!S^Gx0NQzSBcL<3#pv6*Y
zf%MuwE*mi|ULRA`Na9su3o~GM(Cc)Nknk*=3U)IGeB9|ZSFQ6fb_pWSZ(*0|a>&kT
zGi0MrFAjxtgNH(m6y(Kw!uP0Tb2?_YCzDmwjXHbHbHy
ztz#~8gKPZ*VrPldOFBXeG<3EyFD5cNgBpfsk%!Kt<&MZPwVx|J8pi`<$k8aD0{cRF
z^@)um@sk7}A(z5JG@}0IqCg_W=`c4SI(
zG^)np3NIujbz?g}1)JpgjP8~KI3l~8K5`Lc_(2Y)(5T5@1SK0z*6gL193;>snK)YF
zjuTfG-A0L`iER|yAxb9dA#(FUMOT5-k4xg8q<;z^y8r+H
diff --git a/osinaweb/osinacore/__pycache__/views.cpython-312.pyc b/osinaweb/osinacore/__pycache__/views.cpython-312.pyc
index 2e27dc4a458d4fd7506970802fd603f868df9f4a..fd84b9448734fe0d316781232b580bba29574a17 100644
GIT binary patch
delta 4264
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
Pvv*7)aV!kaA2|Gf9_T~8
delta 3844
zcmZ`+dvH|c72j`n@7>M5vVrWzgv2I+ENtYBnh-Go2M9mQ2kK6zGial`B@Aug7Crxc^S*1T0=r6R-bwK>~8{vUu7?$7fk$V}h)!Yy-
z&4>P?8;su+jkVvZJ9MWmCA|9_X<5sm_4Lzi37;+>c3514Eonn-uEp7G3IAbc(P@`9
zW=IP4^Kx=z-FDb+Nrr41Y|#KTmE2wsb(m7BQ&Uva%avv&rNxLdB`vPDsW2u|%mPpu
zsZ%&@%d-jm2vIkW;vdr)=dG$Kx2>kXdDE{)926
zw9C$(g6$LA*)I5YVhj5{te8|Q9Yy6S!aW>075
zp=tIU>ECErV;r2_BeOSQZ1vXLL>%PCWOJLMjqGQ-<0&jsEGb?<2cf)}K}}ex;@e{?
z+7Ev}f0wNGz_-<9tRJQ=D3h(TL2AL=Dc_RrJMth~9{3sI4jr|$#1cwZoNFC;Ew~*c
z!M}kE3rZz71;q$1tZ+mgq~#(KA}u1OKdTcDoT?9bxraOuJZtpU3^2AE*4Kt3S0t8l
zYE`S#Dl*|R0I$|Yq#&++$@si>Dr1)*x326eWqHXev`gfP;H0s+ZU)O4*+^W5!5YrS
zvz16;^!$IwSfuMnbk{teL-yhi>tNgP~;_wT-Q?f1x-KC7ng=t@u(jpR?Hu77AHXXJD}
zvDKHYYPjrviBP(%OidtbagHcbrrd3LFD0>fWL)S34)zAJtxCh{(&EW>l}|>CamHKA
zUSm0bq|JoW!Sqk1)zdKjIpNHvZZ(-wRCQ?Gbkvo@JIfC-Kk(Qs^7UlvC)?3Jk*OiW
z8&EOF_$=mQ{xzbFVi!it1a7Z$>8WXx0BgWHn2N{9>ofn-0t;f%(dO4+H7f$ZeLjp7j79%
z=PlGdN8H2Pc@wU*PxqoBzCdZe?q68~S@n5qmtow}fplg%sQdIlBBKXeoSvER(BB@6
zogO6Y!DgQJZI3!_x({t|N=OF;CF4Zl5qu`{o*v|Jn}F_#jmBl-r)MIUJ{tn32<2+N2=^G0bE^O-KGcucOSWr!R;aAo!AiW){Ak;0*#%B{J_r
z+LV;8WV34e2YaU&T2%fTsoYrl*#8ujOPGA})C=;nd&x+XPtzSKN5q3PKvHb2|lC>oZ;0tT#Zq4WrdE}0u}05>0TsH7)`3qaA^5d3kCadt?B8+
zNh4+rk3VYp>}|;FE+`m&VunVrkzlN3(AYgiYC~@y8C$wzEJx_>qK%#)kCK+u+7-SO
ze!6essAVX|hk`~=E1*kZ*6M4eP85G`#8y{1f<7dB+$9SuN^UDG>Eg%X4?Vf;47}4b
zH*|eJD%Bvc25vM>}v#r{;dcb$^?Vw}ZtSQ}(cZ%q$0v}Q
zrZ(&G6Ww2&w2EZA34#Qt2z&$!2@Vp758MS8HcrmjgkDV#zOyNuEU{JdXUJeZL^j>*
z-9S6ir|=_?+LXsO!q!c-(sq=NHa^*O$Syxhx+d7Rd4jY9rE`sAn>RYxPMEb#!8&+y
z+jI#~+-Q8fE$&3|O}#OB5BYou4)m5tk09A*yxUtV&v=O(y-e^bfw<`6Qol*;W&&}&
z|3cIo1jk{~!ysJ@9HBVRfBaE#iCwfue_8nd+#i1A1>Kytl#^xb1nTBg&!q&p5R4-
zV+1r>a~gL!&63t+NYkB|*EmgMVzlBkMOibG7=>uw5z_*v*3YS}bL!5VS}vzv$LRs!
zbfNjZtPYVb7N`5csWdrdnNw2vP6Em!r-X4j^&xalXPSucoqJYCXQI1ZspQY23jf*E
sMd01PIWx?vE;(%W;D8;efg6n{_cMFeb*z?=G(2D@a$p6#aNzL&0C0@Tg#Z8m
diff --git a/osinaweb/osinacore/edit/__pycache__/urls.cpython-312.pyc b/osinaweb/osinacore/edit/__pycache__/urls.cpython-312.pyc
index 618e110f7d87a65414e1a8ae9b21ac59f2afb482..09f93300706fdcbefd5b05f78a3baf69f9774e81 100644
GIT binary patch
delta 232
zcmdlczEMK`G%qg~0}vSe2}^s-!NBks#DM`RDC6^ljq0h)222d8j4Ar5%vnY-1qeFD
zU=7=9W(YrBEJ~`7uS|Z&S<0`!
jLG-$z=S4%$3jrxtSW-8~arrWGn@aODHF6gj0+j&(|8_d1
delta 121
zcmdleu}xh4G%qg~0}yygg{0MRFfcp@abQ3a%J`hIQ9YHJBV9B~vQl5uVDcX3x0@fc
ztY&7En%vKkJDHJlBa1jt>Ew-^l9SJK)^HgCIgCJDd|+}YSLx<^TpoWNyFzXl-#x@aD&}OucSr{w1EfNsy
zhA4?48oU8xLKK40At)?wL=>XnFXV?p-Jn=zKphT$&!CA8BHnL1_sSx;KYV|D-nr-8
zbMHGp?tQPv$bmSq9=BLb0)ISL=Pf=qbCY#AIoOi_2FX$^0mph_7fk$l$h9iRovWTD
zpSzf6a;ENC!cGo-AY+ZN#KdAgyG6HKw@a6rN{d+Zj>&x{bDD`Ao}8;|7|-oac1>sR
zn=>+P4iO?lQws?KU*5)u&CXiyu}1^?K*m3N>>{Zt_X%#Xl4kRPTSsO7qK|MS29?j9
zTji_qmU(NuH9cga+e{5GE`rfg6>Mlw0#!7$MDa(c0|o_%12uT3hCOLJn?+XT!yCkf&;c&2y7r_?^LD|Gw3kt-I+~rU8V!>cNS;KyxIL(0N
zR=e4@Nm*>RCx>icOFa_|sg2mno)YmnZXc(1dTc~wT)bPoGHD+nTUg7KQR0hSF;hJ|
zWsHt1uH9K~+sqaGW0QU0=Q4ePJy@8}jZKB)3|pbt%vuUZi!X6;zIv`O2uJVK%Ih3w
zU+*}AbxpMywx^u0P0bf~aIsDuUv#gIyvkM&8+0wZKINVvi8$)pz
zNH)X!kUjvCE$|^E?cjWb;X&YIAOsu%N@eg9AlVvyt>ey2bp>xhmAZsm3SOFc7xtKNbD69VO0-lZ(MpeU*Zs#S8t{}^b(9tlNi>-$RM
ziv*V`TJ#lZZ7k!fwCMYFz~GyA08OxU3oD1Da)5xC892d~`b)%Lxmcp^^|up}$DUG7L|4PM5x}2-;vYb9?^E32bO+E3
z;O3>cZ7D8FihG3Ogi&-NMG+|0-YL+rkjHTJNX5%Sffe=2G}^<5{MHe|S2?@&gpdv)
g_q{>tZ#JAO+wwovmv5yd
zd>c>?Oa($f1MmUxA&>(oKoHOo%toF&KF|cKS*$P2X4^$`;q(mb88N#3eqZfoug4Xr
zbNM_xBsvP`E1%KSLwUV$vX%wJ!-dQA2yQToEz2{+O3T|UEZmj?z51Od@twt??4bE9
z8L>=Z%9mumE1xVn%Gg(;y(mZ7O#@5iV9~rJ8hEzYIb|0O(9!ht;?=;{qQaU-lO^`4
z;tT6^{kIt0CEBfXl|5vZ$|0){!AouB{|H_kA3S2q)PElherC&4TF9)DbBf$%pSSDVzsUeBA%z17MR|5
z2mM~p1QkDH{V{?$Ga&(DT4h=Ibw@T~qh3Hgv3j-?xXA=_+MACZF>G}E11@)Uz_-;G
z2=P7ysuy?`);WSdjX-rkj~K1YR{kLOnq+IwYr_Lrqvq)%tXPU-*_n}$I7G*?a|!Ms
za2fa=7y{ztuTWEF!b~slA2T+L7-TFRsh;#ivw^xGc&&QkEi(A32opRftrR_$REW
zW?0vN2yh*^0o(*efm^^|z-=IQKe5~=RM_E@2u~pScd#yjON#xnhJU*s>?pQ)(^;Qz
z*Emw|lfRJk`_HQVsK2J0v0Tx(;bIuwpQEF5^m2~=&C!Q>3(y9jd#b&WqpflD0FGaU
zqpmpan`8e28lDduP4#)QZBv~mxY4_ekC98AP~*Q#e5_@R-Oyy;(l~}Rj++{*81S{o
IrjPCHC8g1`GXMYp
diff --git a/osinaweb/osinacore/migrations/__pycache__/0082_pinnedproject.cpython-312.pyc b/osinaweb/osinacore/migrations/__pycache__/0082_pinnedproject.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..23d9c4fec2cd017ff43c419b70c442057d71d0c3
GIT binary patch
literal 1499
zcmcgs&2Jk;6rcU@de?DMy9%{jSs|d5#740Lk|iH1RFgOaXiUEnDI1B=+B31%wRhc}
zbtCr#QV$$^qklqCa)1-%#1SMeyCTv?!vQ2t+$^QNR2-Pu^(K*$GjFBY_kQ!{eaw4r
zew&_70Y)qTZtvZc0Qj2=F(oF<$vwt=3lKm;5A+3H5I8UP#J;3UeOZ@7S?VQpMFgJ!
zBtHcxfu-(DZ0PKNz^O#N+7_Wo-$uAcnr*HZ
zQy4E3PF@H+DhzZ10bLXU^Qgv3XMddNrq869J78xyA)zDc$?$9@Le8&9L=xN6y0hoe
zh(|K}5=c2r9>@{0Cn7b}zIIU?r@PlLqTQ>PV1-Mtxr-Rm4pRqWgfq`m|DWf}Z}faL
z9qBL~$JP<_%xJneL$%Ggu&m0OO-##Z+YY9gm6h5Dkhq3BB+xa;LppuOv@DG7ICdAe
zT`HRB!8#Q`T`S5oZ46x-wjFG^7}2SLWA+Va1RvrN)d+S>qh~(BH2oMmEt_Cy8GTHX
zgUHa6?5Wf81PUXuAZs%0Vk){em50m>gXQq3vS;ERBF$o!sxY($Ax%NZ`f}LAj88-O
zXlV4fGK3Cq1UgIhjlsZZv3-OG*h1K9j~w3j^h$l}!3NyA-?#@izgTPBrs-1+6B9bM
z8s@dho8IBWN7EmhojS{SorghF>+HVFj`caqRzY3E>ey67Evkm`vx%X})%yL_`dWjg
z>;axk(Rbj4cgY*Ovc*y(6?O@3+wND^?DnvaEtgc9hHLaje8V!9BfAv~?}ze44EcTB
zij;WWDra+AVHNxk4#J{MF19=vIZ5U81SZf~P~za*lGu%ecqc
z>t12``Fc=T_6y4|m7lerw4k=(*EWLMUB7lWsO|W*9q-FWM+L{rkmGF5%a@*C3-TpD
zU;2Lg$DJQ`f@;IBHiBx?uQr3~wqM=$cH6-&@ps8l-t{uWaZ;Y0d6h_Nsj;M8Rlfer
zc`weasM4wEhRSW*+KZ~JO%T)y8zQP?{uC@nk6Jk{nlm3;b8c`hG``5VH|ou(&pvYA
rXCi;G$h&MAOM)Q0R)Fx%pJ3?^F#k%)2+FfmkXi6E3$FnaLL2`9
@@ -384,13 +394,23 @@
style="display: none;" id="userProfileDropdown">
+ class="w-full py-3 flex items-center gap-2 text-white hover:text-osiblue duration-300 cursor-pointer border-b border-white border-opacity-10">
Logout
+
+
+
diff --git a/osinaweb/osinacore/templates/details_templates/customer-details.html b/osinaweb/osinacore/templates/details_templates/customer-details.html
index 1f5cad7b..8d442925 100644
--- a/osinaweb/osinacore/templates/details_templates/customer-details.html
+++ b/osinaweb/osinacore/templates/details_templates/customer-details.html
@@ -71,6 +71,13 @@
Email: {{customer.user.email}}
+
+
+ Mobile Number: {{customer.mobile_number}}
+
+
+
{% if customer.personal_website %}
Personal Website:
{% if user_offline %}
-
+
You are Currently Offline
diff --git a/osinaweb/osinacore/templates/projects-by-status.html b/osinaweb/osinacore/templates/projects-by-status.html
index 45154c65..36e2f7a9 100644
--- a/osinaweb/osinacore/templates/projects-by-status.html
+++ b/osinaweb/osinacore/templates/projects-by-status.html
@@ -74,6 +74,14 @@
{% if project.open_user_tasks_count == 1 %} Task {% else %} Tasks {% endif %}
+
+
+ {{project.ticket_set.all.count}} Open {% if project.ticket_set.all.count == 1 %} Ticket {% else %} Tickets {% endif %}
+
+
-
-
-
@@ -109,7 +106,7 @@
{% if project.note_set.exists %}
{% with last_note=project.note_set.last %}
- {{ last_note.text }}
+ {{ last_note.text }}
|