This commit is contained in:
Marwan Alwali 2025-02-02 17:22:35 +03:00
parent a4433631fb
commit c92371a9b5
32 changed files with 1099 additions and 610 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -5,7 +5,7 @@ from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from inventory import views
import debug_toolbar
from two_factor.urls import urlpatterns as tf_urls
# from two_factor.urls import urlpatterns as tf_urls
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
@ -26,7 +26,7 @@ urlpatterns += i18n_patterns(
path("haikalbot/", include("haikalbot.urls")),
path('appointment/', include('appointment.urls')),
path('plans/', include('plans.urls')),
path('', include(tf_urls)),
# path('', include(tf_urls)),
)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -422,10 +422,12 @@ class CarSelectionTable(tables.Table):
class WizardForm1(forms.Form):
email = forms.EmailField(
label=_("Email Address"),
widget=forms.EmailInput(
attrs={
"class": "form-control",
"placeholder": "Email address",
"class": "form-control form-control-sm email",
"placeholder": _("Email address"),
"name": _("email"),
"required": "required",
}
),
@ -433,10 +435,12 @@ class WizardForm1(forms.Form):
"required": _("You must add an email."),
},
)
password = forms.CharField(
label=_("Password"),
widget=forms.PasswordInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("Password"),
"required": "required",
}
@ -445,10 +449,12 @@ class WizardForm1(forms.Form):
"required": _("This field is required."),
},
)
confirm_password = forms.CharField(
label=_("Confirm Password"),
widget=forms.PasswordInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("Confirm Password"),
"required": "required",
}
@ -457,7 +463,9 @@ class WizardForm1(forms.Form):
"required": _("This field is required."),
},
)
terms = forms.BooleanField(
label=_("I accept the Terms and Privacy Policy"),
widget=forms.CheckboxInput(
attrs={
"class": "form-check-input",
@ -472,9 +480,10 @@ class WizardForm1(forms.Form):
class WizardForm2(forms.Form):
name = forms.CharField(
label=_("Name"),
widget=forms.TextInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("English Name"),
"required": "required",
}
@ -483,10 +492,12 @@ class WizardForm2(forms.Form):
"required": _("Please enter an English Name."),
},
)
arabic_name = forms.CharField(
label=_("Arabic Name"),
widget=forms.TextInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("Arabic Name"),
"required": "required",
}
@ -495,12 +506,14 @@ class WizardForm2(forms.Form):
"required": _("Please enter an Arabic name."),
},
)
phone_number = PhoneNumberField(
label=_("Phone Number"),
min_length=10,
max_length=10,
widget=forms.TextInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("Phone"),
"required": "required",
}
@ -516,9 +529,10 @@ class WizardForm2(forms.Form):
class WizardForm3(forms.Form):
# CRN field with max length of 10
crn = forms.CharField(
label=_("CRN"),
widget=forms.TextInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("Commercial Registration Number"),
"required": "required",
"maxlength": "10",
@ -526,16 +540,17 @@ class WizardForm3(forms.Form):
),
max_length=10,
error_messages={
"required": "This field is required.",
"required": _("This field is required."),
"max_length": "Commercial Registration Number must be 10 characters.",
},
)
# VRN field with max length of 15
vrn = forms.CharField(
label=_("VRN"),
widget=forms.TextInput(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"placeholder": _("VAT Registration Number"),
"required": "required",
"maxlength": "15",
@ -549,9 +564,10 @@ class WizardForm3(forms.Form):
)
address = forms.CharField(
label=_("Address"),
widget=forms.Textarea(
attrs={
"class": "form-control",
"class": "form-control form-control-sm",
"rows": "3",
"required": "required",
}

View File

@ -16,7 +16,7 @@ urlpatterns = [
# ),
# path('signup/', allauth_views.SignupView.as_view(template_name='account/signup.html'), name='account_signup'),
path("signup/", views.dealer_signup, name="account_signup"),
path("otp", views.OTPView.as_view(), name="otp"),
# path("otp", views.OTPView.as_view(), name="otp"),
# path(
# "password/change/", allauth_views.PasswordChangeView.as_view(template_name="account/password_change.html"), name="account_change_password",
# ),

14
inventory/utilities/sa.py Normal file
View File

@ -0,0 +1,14 @@
from plans.taxation import TaxationPolicy
from django.conf import settings
class SaudiTaxationPolicy(TaxationPolicy):
def get_default_tax(self):
return getattr(settings, 'PLANS_TAX', None)
def get_issuer_country_code(self):
return getattr(settings, 'PLANS_TAX_COUNTRY', None)
def get_tax_rate(self, tax_id, country_code, request=None):
return 0, True

View File

@ -26,6 +26,7 @@ from django_ledger.models import (
from decimal import Decimal
def get_jwt_token():
url = "https://carapi.app/api/auth/login"
headers = {
@ -669,3 +670,7 @@ class CarFinanceCalculator:
"additionals": self.additional_services,
"vat": self.vat_rate,
}

View File

@ -73,9 +73,9 @@ from django.urls import reverse, reverse_lazy
from django.contrib import messages
from django.db.models import Sum, F, Count
from django.db import transaction
from two_factor.utils import default_device
# from two_factor.utils import default_device
from two_factor.views import OTPRequiredMixin
# from two_factor.views import OTPRequiredMixin
from .forms import VendorForm
from .services import (
@ -102,15 +102,13 @@ from .utils import (
transfer_car,
)
from django.contrib.auth.models import User
from allauth.account import views as allauth_views
from django.db.models import Count, F, Value
from django.contrib.auth import authenticate
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from django.core.files.storage import default_storage
from plans.models import Plan,PlanPricing
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
@ -152,6 +150,7 @@ def switch_language(request):
return redirect("/")
def dealer_signup(request, *args, **kwargs):
if request.method == "POST":
data = json.loads(request.body)
@ -213,31 +212,29 @@ def dealer_signup(request, *args, **kwargs):
# class Login(allauth_views.LoginView):
# template_name = "account/login.html"
# redirect_authenticated_user = True
class OTPView(View, LoginRequiredMixin):
template_name = "account/otp_verification.html"
def get(self, request, *args, **kwargs):
# device = default_device(request.user)
# device.generate_challenge()
return render(request, self.template_name)
def post(self, request, *args, **kwargs):
otp_code = request.POST.get("otp_code")
if self.verify_otp(otp_code, request.user):
messages.success(request, _("OTP verified successfully!"))
return redirect("home")
messages.error(request, _("Invalid OTP. Please try again."))
return render(request, self.template_name)
def verify_otp(self, otp_code, user):
device = default_device(user)
if device and device.verify_token(otp_code):
return True
return False
# class OTPView(View, LoginRequiredMixin):
# template_name = "account/otp_verification.html"
#
# def get(self, request, *args, **kwargs):
# # device = default_device(request.user)
# EmailDevice.generate_challenge(self)
# return render(request, self.template_name)
#
# def post(self, request, *args, **kwargs):
# otp_code = request.POST.get("otp_code")
#
# if self.verify_otp(otp_code, request.user):
# messages.success(request, _("OTP verified successfully!"))
# return redirect("home")
#
# messages.error(request, _("Invalid OTP. Please try again."))
# return render(request, self.template_name)
#
# def verify_otp(self, otp_code, user):
# device = default_device(user)
# if device and device.verify_token(otp_code):
# return True
# return False
class HomeView(TemplateView):
@ -321,11 +318,20 @@ class AccountingDashboard(LoginRequiredMixin, TemplateView):
class WelcomeView(TemplateView):
template_name = "welcome.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
dealer = get_user_type(self.request)
plans = Plan.objects.all()
# pricing = PlanPricing.objects.filter(plan=plan).
context["plans"] = plans
return context
class CarCreateView(LoginRequiredMixin, CreateView):
model = models.Car
form_class = forms.CarForm
template_name = "inventory/car_form.html"
# success_url = reverse_lazy('inventory_stats')
def get_form(self, form_class=None):
@ -1077,7 +1083,7 @@ class CustomerListView(LoginRequiredMixin, ListView):
query = self.request.GET.get("q")
dealer = get_user_type(self.request)
customers = dealer.entity.get_customers().filter(active=True,additional_info__type="customer")
customers = dealer.entity.get_customers().filter(active=True, additional_info__type="customer")
if query:
customers = customers.filter(
@ -1210,7 +1216,8 @@ def CustomerUpdateView(request, pk):
messages.success(request, _("Customer updated successfully."))
return redirect("customer_list")
else:
form = forms.CustomerForm(initial=customer.additional_info["customer_info"] if "customer_info" in customer.additional_info else {})
form = forms.CustomerForm(
initial=customer.additional_info["customer_info"] if "customer_info" in customer.additional_info else {})
return render(request, "customers/customer_form.html", {"form": form})
@ -1422,80 +1429,80 @@ def delete_vendor(request, pk):
# invoice_model.save()
# quotation.save()
# elif status == "approved":
# if qoutation.status == "Approved":
# messages.error(request, "Quotation is already approved")
# return redirect("quotation_detail", pk=pk)
# elif status == "approved":
# if qoutation.status == "Approved":
# messages.error(request, "Quotation is already approved")
# return redirect("quotation_detail", pk=pk)
# invoice_model = invoice_model.filter(date_in_review=qoutation.date_in_review).first()
# if not invoice_model.can_approve():
# messages.error(request, "Quotation is not ready for approval")
# return redirect("quotation_detail", pk=pk)
# invoice_model = invoice_model.filter(date_in_review=qoutation.date_in_review).first()
# if not invoice_model.can_approve():
# messages.error(request, "Quotation is not ready for approval")
# return redirect("quotation_detail", pk=pk)
# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# invoice_model.date_approved = date
# qoutation.date_approved = date
# invoice_model.save()
# qoutation.status = "Approved"
# qoutation.save()
# messages.success(request, _("Quotation Approved"))
# ledger = entity.create_ledger(
# name=f"Payment Ledger for Invoice {invoice_model}",
# posted=True
# )
# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# invoice_model.date_approved = date
# qoutation.date_approved = date
# invoice_model.save()
# qoutation.status = "Approved"
# qoutation.save()
# messages.success(request, _("Quotation Approved"))
# ledger = entity.create_ledger(
# name=f"Payment Ledger for Invoice {invoice_model}",
# posted=True
# )
# entity_unit,created = EntityUnitModel.objects.get_or_create(
# name="Sales Department",
# entity=entity,
# document_prefix="SD"
# )
# entity_unit,created = EntityUnitModel.objects.get_or_create(
# name="Sales Department",
# entity=entity,
# document_prefix="SD"
# )
# journal_entry = JournalEntryModel.objects.create(
# entity_unit=entity_unit,
# posted=False,
# description=f"Payment for Invoice {invoice_model}",
# ledger=ledger,
# locked=False,
# origin="Payment",
# )
# journal_entry = JournalEntryModel.objects.create(
# entity_unit=entity_unit,
# posted=False,
# description=f"Payment for Invoice {invoice_model}",
# ledger=ledger,
# locked=False,
# origin="Payment",
# )
# accounts_receivable = coa_qs.first().get_coa_accounts().filter(name="Accounts Receivable").first()
# if not accounts_receivable:
# accounts_receivable = entity.create_account(
# code="AR",
# role="asset",
# name="Accounts Receivable",
# coa_model=coa_qs.first(),
# balance_type="credit"
# )
# accounts_receivable = coa_qs.first().get_coa_accounts().filter(name="Accounts Receivable").first()
# if not accounts_receivable:
# accounts_receivable = entity.create_account(
# code="AR",
# role="asset",
# name="Accounts Receivable",
# coa_model=coa_qs.first(),
# balance_type="credit"
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=cash_account.first(), # Debit Cash
# amount=invoice_model.amount_due, # Payment amount
# tx_type='debit',
# description="Payment Received",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=cash_account.first(), # Debit Cash
# amount=invoice_model.amount_due, # Payment amount
# tx_type='debit',
# description="Payment Received",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=accounts_receivable, # Credit Accounts Receivable
# amount=invoice_model.amount_due, # Payment amount
# tx_type='credit',
# description="Payment Received",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=accounts_receivable, # Credit Accounts Receivable
# amount=invoice_model.amount_due, # Payment amount
# tx_type='credit',
# description="Payment Received",
# )
# invoice_model.mark_as_review()
# print("reviewed")
# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# print("approved")
# invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# print("paid")
# invoice_model.save()
# messages.success(request, "Invoice created")
# return redirect("quotation_detail", pk=pk)
# invoice_model.mark_as_review()
# print("reviewed")
# invoice_model.mark_as_approved(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# print("approved")
# invoice_model.mark_as_paid(entity_slug=entity.slug, user_model=request.user.dealer.get_root_dealer.user)
# print("paid")
# invoice_model.save()
# messages.success(request, "Invoice created")
# return redirect("quotation_detail", pk=pk)
# return redirect('django_ledger:invoice-detail', entity_slug=quotation.entity.slug, invoice_pk=invoice.uuid)
# return redirect('django_ledger:invoice-detail', entity_slug=quotation.entity.slug, invoice_pk=invoice.uuid)
# @login_required
@ -1527,45 +1534,45 @@ def delete_vendor(request, pk):
# .first()
# )
# return
# if not ledger:
# ledger = entity.create_ledger(name=f"Payment Ledger for Invoice {invoice_model}",posted=True)
# if not ledger:
# ledger = entity.create_ledger(name=f"Payment Ledger for Invoice {invoice_model}",posted=True)
# entity_unit,created = EntityUnitModel.objects.get_or_create(
# name="Sales Department",
# entity=entity,
# document_prefix="SD"
# )
# entity_unit,created = EntityUnitModel.objects.get_or_create(
# name="Sales Department",
# entity=entity,
# document_prefix="SD"
# )
# journal_entry = JournalEntryModel.objects.create(
# entity_unit=entity_unit,
# posted=False,
# description=f"Payment for Invoice {invoice_model}",
# ledger=ledger,
# locked=False,
# origin="Payment",
# )
# journal_entry = JournalEntryModel.objects.create(
# entity_unit=entity_unit,
# posted=False,
# description=f"Payment for Invoice {invoice_model}",
# ledger=ledger,
# locked=False,
# origin="Payment",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=cash_account.first(), # Debit Cash
# amount=invoice_model.amount_due, # Payment amount
# tx_type='debit',
# description="Payment Received",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=cash_account.first(), # Debit Cash
# amount=invoice_model.amount_due, # Payment amount
# tx_type='debit',
# description="Payment Received",
# )
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=recivable_account.first(), # Credit Accounts Receivable
# amount=invoice_model.amount_due, # Payment amount
# tx_type='credit',
# description="Payment Received",
# )
# journal_entry.posted = True
# qoutation.posted = True
# qoutation.save()
# journal_entry.save()
# messages.success(request, "Invoice posted")
# return redirect("quotation_detail", pk=pk)
# TransactionModel.objects.create(
# journal_entry=journal_entry,
# account=recivable_account.first(), # Credit Accounts Receivable
# amount=invoice_model.amount_due, # Payment amount
# tx_type='credit',
# description="Payment Received",
# )
# journal_entry.posted = True
# qoutation.posted = True
# qoutation.save()
# journal_entry.save()
# messages.success(request, "Invoice posted")
# return redirect("quotation_detail", pk=pk)
# @login_required
@ -1754,7 +1761,7 @@ class OrganizationListView(LoginRequiredMixin, ListView):
def get_queryset(self):
dealer = get_user_type(self.request)
return dealer.entity.get_customers().filter(additional_info__type="organization",active=True).all()
return dealer.entity.get_customers().filter(additional_info__type="organization", active=True).all()
class OrganizationDetailView(DetailView):
@ -1797,8 +1804,7 @@ def OrganizationCreateView(request):
return render(request, "organizations/organization_form.html", {"form": form})
def OrganizationUpdateView(request,pk):
def OrganizationUpdateView(request, pk):
organization = get_object_or_404(CustomerModel, pk=pk)
if request.method == "POST":
form = forms.OrganizationForm(request.POST)
@ -2446,13 +2452,16 @@ def create_sale_order(request, pk):
return render(
request,
"sales/estimates/sale_order_form.html",
{"form": form, "estimate": estimate, "items": items,"data": finance_data},
{"form": form, "estimate": estimate, "items": items, "data": finance_data},
)
def preview_sale_order(request,pk):
estimate = get_object_or_404(EstimateModel,pk=pk)
def preview_sale_order(request, pk):
estimate = get_object_or_404(EstimateModel, pk=pk)
data = get_car_finance_data(estimate)
return render(request,'sales/estimates/sale_order_preview.html',{'order':estimate.sale_orders.first(),"data":data,"estimate":estimate})
return render(request, 'sales/estimates/sale_order_preview.html',
{'order': estimate.sale_orders.first(), "data": data, "estimate": estimate})
class PaymentRequest(LoginRequiredMixin, DetailView):
model = EstimateModel
@ -2545,7 +2554,7 @@ class InvoiceDetailView(LoginRequiredMixin, DetailView):
if invoice.get_itemtxs_data():
calculator = CarFinanceCalculator(invoice)
finance_data = calculator.get_finance_data()
print((finance_data["total_vat_amount"]+finance_data["total_price"]) == finance_data["grand_total"])
print((finance_data["total_vat_amount"] + finance_data["total_price"]) == finance_data["grand_total"])
kwargs["data"] = finance_data
kwargs["payments"] = JournalEntryModel.objects.filter(
ledger=invoice.ledger
@ -3196,7 +3205,6 @@ class BillDetailView(LoginRequiredMixin, DetailView):
)
vat = models.VatRate.objects.filter(is_active=True).first()
if vat:
grand_total += round(Decimal(grand_total) * Decimal(vat.rate), 2)
kwargs["car_and_item_info"] = car_and_item_info
kwargs["grand_total"] = grand_total
@ -3422,7 +3430,7 @@ def bill_create(request):
}
)
car_list = models.Car.objects.filter(
dealer=dealer, finances__selling_price__gt=0,status="available"
dealer=dealer, finances__selling_price__gt=0, status="available"
)
context = {
"form": form,
@ -3530,11 +3538,11 @@ def custom_bad_request_view(request, exception=None):
return render(request, "errors/400.html", {})
# from django_ledger.io.io_core import get_localdate
# from django_ledger.views.mixins import (DjangoLedgerSecurityMixIn)
# from django.views.generic import RedirectView
from django_ledger.views.financial_statement import FiscalYearBalanceSheetView,BaseIncomeStatementRedirectView,FiscalYearIncomeStatementView
from django_ledger.views.financial_statement import FiscalYearBalanceSheetView, BaseIncomeStatementRedirectView, \
FiscalYearIncomeStatementView
from django.views.generic import DetailView, RedirectView
from django_ledger.io.io_core import get_localdate
@ -3544,6 +3552,8 @@ from django_ledger.views.mixins import (
MonthlyReportMixIn, DateReportMixIn, DjangoLedgerSecurityMixIn, EntityUnitMixIn,
BaseDateNavigationUrlMixIn, PDFReportMixIn
)
# BALANCE SHEET -----------
class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView):
@ -3555,14 +3565,18 @@ class BaseBalanceSheetRedirectView(DjangoLedgerSecurityMixIn, RedirectView):
'entity_slug': self.kwargs['entity_slug'],
'year': year
})
class FiscalYearBalanceSheetViewBase(FiscalYearBalanceSheetView):
template_name = "ledger/reports/balance_sheet.html"
class QuarterlyBalanceSheetView(FiscalYearBalanceSheetViewBase, QuarterlyReportMixIn):
"""
Quarter Balance Sheet View.
"""
class MonthlyBalanceSheetView(FiscalYearBalanceSheetViewBase, MonthlyReportMixIn):
"""
Monthly Balance Sheet View.
@ -3574,6 +3588,7 @@ class DateBalanceSheetView(FiscalYearBalanceSheetViewBase, DateReportMixIn):
Date Balance Sheet View.
"""
class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView):
def get_redirect_url(self, *args, **kwargs):
@ -3585,9 +3600,11 @@ class BaseIncomeStatementRedirectViewBase(BaseIncomeStatementRedirectView):
'year': year
})
class FiscalYearIncomeStatementViewBase(FiscalYearIncomeStatementView):
template_name = "ledger/reports/income_statement.html"
class QuarterlyIncomeStatementView(FiscalYearIncomeStatementView, QuarterlyReportMixIn):
"""
Quarter Income Statement View.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -57,7 +57,6 @@ django-next-url-mixin==0.4.0
django-nine==0.2.7
django-nonefield==0.4
django-ordered-model==3.7.4
django-otp==1.5.4
django-phonenumber-field==8.0.0
django-picklefield==3.2
django-plans==1.2.0
@ -70,7 +69,6 @@ django-sms==0.7.0
django-sslserver==0.22
django-tables2==2.7.5
django-treebeard==4.7.1
django-two-factor-auth==1.17.0
django-view-breadcrumbs==2.5.1
djangocms-admin-style==3.3.1
djangorestframework==3.15.2

BIN
static/.DS_Store vendored

Binary file not shown.

Binary file not shown.

BIN
static/images/icons/.DS_Store vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 490 490" style="enable-background:new 0 0 490 490;" xml:space="preserve">
<g>
<g>
<g>
<path d="M480,325h-5V45c0-5.523-4.477-10-10-10H300V10c0-5.523-4.477-10-10-10h-90c-5.523,0-10,4.477-10,10v25H25
c-5.523,0-10,4.477-10,10v280h-5c-5.523,0-10,4.477-10,10v35c0,5.523,4.477,10,10,10h152.338l-50.913,84.855l17.149,10.29
L185.662,380H235v110h20V380h49.338l57.087,95.145l17.149-10.29L327.662,380H480c5.523,0,10-4.477,10-10v-35
C490,329.477,485.523,325,480,325z M210,20h70v15h-70V20z M35,55h420v270H35V55z M470,360H20v-15h450V360z"/>
<path d="M170,90c-55.14,0-100,44.86-100,100s44.86,100,100,100s100-44.86,100-100S225.14,90,170,90z M170,270
c-44.112,0-80-35.888-80-80c0-40.724,30.593-74.413,70-79.353V190c0,5.523,4.477,10,10,10h79.353
C244.413,239.407,210.724,270,170,270z M180,180v-69.353c36.128,4.529,64.824,33.225,69.353,69.353H180z"/>
<rect x="345" y="130" width="70" height="20"/>
<rect x="345" y="160" width="70" height="20"/>
<rect x="345" y="190" width="70" height="20"/>
<rect x="345" y="100" width="45" height="20"/>
<path d="M324.999,119.999v-20h-45c-2.652,0-5.196,1.054-7.071,2.929l-15,15l14.143,14.143l12.07-12.072H324.999z"/>
<rect x="310" y="235" width="115" height="20"/>
<rect x="280" y="270" width="145" height="20"/>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 484.507 484.507" style="enable-background:new 0 0 484.507 484.507;" xml:space="preserve">
<g>
<g>
<g>
<path d="M432.503,237.194h-44.357V10c0-5.522-4.478-10-10-10H52.003c-5.523,0-10,4.478-10,10v464.507c0,5.522,4.477,10,10,10
h375.559c8.937,0,14.941-7.99,14.941-19.884V247.194C442.503,241.672,438.026,237.194,432.503,237.194z M368.146,464.507H62.003
V20h306.143V464.507z M422.503,464.507h-34.357V257.194h34.357V464.507z"/>
<rect x="86.594" y="39.532" width="59.299" height="20"/>
<rect x="86.594" y="79.064" width="118.598" height="20"/>
<rect x="294.141" y="39.532" width="19.766" height="20"/>
<rect x="323.791" y="39.532" width="19.766" height="20"/>
<path d="M111.305,202.838c2.369,0,4.742-0.837,6.641-2.527l44.474-39.532l-13.287-14.947L111.706,179.1L98.607,166
l-14.142,14.142l19.766,19.767C106.178,201.856,108.738,202.838,111.305,202.838z"/>
<rect x="180.485" y="182.838" width="168.013" height="20"/>
<rect x="180.485" y="153.188" width="24.708" height="20"/>
<rect x="220.018" y="153.188" width="24.708" height="20"/>
<path d="M111.305,301.669c2.369,0,4.742-0.837,6.642-2.528l44.474-39.532l-13.287-14.947l-37.426,33.268l-13.099-13.1
l-14.143,14.143l19.766,19.767C106.178,300.687,108.738,301.669,111.305,301.669z"/>
<rect x="180.485" y="281.669" width="168.013" height="20"/>
<rect x="180.485" y="252.02" width="24.708" height="20"/>
<rect x="220.018" y="252.02" width="24.708" height="20"/>
<path d="M111.305,400.5c2.369,0,4.742-0.837,6.642-2.528l44.474-39.532l-13.287-14.947l-37.426,33.268l-13.099-13.1
l-14.143,14.143l19.766,19.767C106.178,399.518,108.738,400.5,111.305,400.5z"/>
<rect x="180.485" y="380.5" width="168.013" height="20"/>
<rect x="180.485" y="350.851" width="24.708" height="20"/>
<rect x="220.018" y="350.851" width="24.708" height="20"/>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="45.451px" height="45.451px" viewBox="0 0 45.451 45.451" style="enable-background:new 0 0 45.451 45.451;"
xml:space="preserve">
<g>
<g>
<path d="M27.828,28.41c-1.102-1.004-1.985-2.243-2.571-3.639H6.723c-1.265,0-2.248-1.021-2.248-2.287V6.4
c0-1.266,0.983-2.308,2.248-2.308H32.41c1.267,0,2.33,1.042,2.33,2.308v4.054c0.015,0,0.025,0,0.039,0
c1.396,0,2.73,0.28,3.947,0.785V6.4c0-3.514-2.804-6.4-6.316-6.4H6.723C3.209,0,0.381,2.887,0.381,6.4v16.086
c0,3.513,2.829,6.379,6.342,6.379h3.81c0.221,1.832,1.824,3.34,3.773,3.34h9.508c0.118-0.17,0.239-0.338,0.365-0.502
C25.199,30.369,26.438,29.259,27.828,28.41z"/>
<path d="M19.5,22.974c0.565,0,1.023-0.459,1.023-1.024v-1.109c2.369-0.418,3.715-2.007,3.715-3.869
c0-1.881-1.013-3.031-3.499-3.91c-1.777-0.668-2.51-1.107-2.51-1.798c0-0.585,0.439-1.171,1.799-1.171
c0.791,0,1.432,0.133,1.94,0.292c0.284,0.089,0.592,0.057,0.852-0.087c0.26-0.144,0.448-0.389,0.521-0.676l0.064-0.249
c0.146-0.566-0.178-1.146-0.738-1.309c-0.551-0.159-1.176-0.276-2.037-0.313V6.936c0-0.565-0.458-1.024-1.023-1.024
c-0.565,0-1.024,0.458-1.024,1.024v0.962c-2.261,0.438-3.543,1.882-3.543,3.722c0,2.028,1.522,3.073,3.759,3.826
c1.55,0.524,2.215,1.025,2.215,1.819c0,0.837-0.816,1.296-2.009,1.296c-0.862,0-1.673-0.176-2.375-0.428
c-0.287-0.102-0.604-0.081-0.873,0.062c-0.271,0.143-0.467,0.392-0.543,0.688l-0.082,0.324c-0.142,0.544,0.169,1.105,0.701,1.291
c0.75,0.26,1.675,0.447,2.643,0.49v0.962C18.476,22.515,18.934,22.974,19.5,22.974z"/>
<path d="M44.984,38.447c-0.755-5.635-5.931-9.594-11.565-8.842c-5.636,0.75-9.594,5.928-8.843,11.563l0.047,0.362
c0.298,2.234,2.205,3.92,4.459,3.92h11.396c2.255,0,4.162-1.686,4.46-3.92l0.047-0.354C45.095,40.311,45.103,39.355,44.984,38.447
z"/>
<circle cx="34.779" cy="20.781" r="7.276"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 490 490" style="enable-background:new 0 0 490 490;" xml:space="preserve">
<g>
<g>
<g>
<path d="M75,250c-5.523,0-10,4.478-10,10v150c0,5.522,4.477,10,10,10h190c5.522,0,10-4.478,10-10V260c0-5.522-4.478-10-10-10H75z
M160,400H85v-55h75V400z M160,325H85v-55h75V325z M255,400h-75v-55h75V400z M255,325h-75v-55h75V325z"/>
<rect x="310" y="205" width="55" height="20"/>
<rect x="380" y="205" width="20" height="20"/>
<path d="M480,185c5.522,0,10-4.478,10-10V25c0-11.028-8.972-20-20-20H20C8.972,5,0,13.972,0,25v150c0,5.522,4.477,10,10,10h20
v280H0v20h490v-20h-30V185H480z M255,25h100v140H255V25z M135,25h100v140H135V25z M20,165V25h95v140H40H20z M405,460H305V270h40
v165h20V270h40V460z M440,465h-15V260c0-5.522-4.478-10-10-10H295c-5.522,0-10,4.478-10,10v205H50V225h220v-20H50v-20h390V465z
M375,165V25h95v140H375z"/>
</g>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,79 +1,76 @@
{% extends "account/base_manage_email.html" %}
{% load allauth i18n %}
{% extends "base.html" %}
{% load crispy_forms_filters %}
{% load allauth i18n static %}
{% block head_title %}
{% trans "Email Addresses" %}
{% endblock head_title %}
{% block content %}
{% element h1 %}
{% trans "Email Addresses" %}
{% endelement %}
<div class="row ">
<div class="row flex-center min-vh-50">
<div class="col-sm-10 col-md-8 col-lg-5 col-xl-5 col-xxl-3">
<a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<img class="d-dark-none" src="{% static 'images/logos/logo-d.png' %}" alt="{% trans 'home' %}" width="58" />
<img class="d-light-none" src="{% static 'images/logos/logo.png' %}" alt="{% trans 'home' %}" width="58" />
</div>
</div>
</a>
<div class="text-center">
<h3 class="mb-4">{% trans "Email Addresses" %}</h3>
</div>
{% if emailaddresses %}
{% element p %}
<p>
{% trans 'The following email addresses are associated with your account:' %}
{% endelement %}
</p>
{% url 'account_email' as email_url %}
{% element form form=form action=email_url method="post" tags="email,list" %}
{% slot body %}
<form action="{{ email_url }}" method="POST" class="form email list">
{% csrf_token %}
<div class="fs-9 fw-bold form-group mb-3 list-group">
{% for radio in emailaddress_radios %}
{% with emailaddress=radio.emailaddress %}
{% element field type="radio" checked=radio.checked name="email" value=emailaddress.email id=radio.id %}
{% slot label %}
{{ emailaddress.email }}
<label for="{{ radio.id }}">
<input type="radio" name="email" checked="{{ radio.checked }}" value="{{ emailaddress.email }}" id="{{ radio.id }}" class="form-check-input mb-3" />
{{ emailaddress.email }}
{% if emailaddress.verified %}
{% element badge tags="success,email,verified" %}
{% translate "Verified" %}
{% endelement %}
<span class="badge badge-phoenix badge-phoenix-success verified">{% translate "Verified" %}</span>
{% else %}
{% element badge tags="warning,email,unverified" %}
{% translate "Unverified" %}
{% endelement %}
<span class="badge badge-phoenix badge-phoenix-warning unverified">{% translate "Unverified" %}</span>
{% endif %}
{% if emailaddress.primary %}
{% element badge tags="email,primary" %}
{% translate "Primary" %}
{% endelement %}
<span class="badge badge-phoenix badge-phoenix-primary email">{% translate "Primary" %}</span>
{% endif %}
{% endslot %}
{% endelement %}
{% endwith %}
</label>
{% endfor %}
{% endslot %}
{% slot actions %}
{% element button type="submit" name="action_primary" %}
{% trans 'Make Primary' %}
{% endelement %}
{% element button tags="secondary" type="submit" name="action_send" %}
{% trans 'Re-send Verification' %}
{% endelement %}
{% element button tags="danger,delete" type="submit" name="action_remove" %}
{% trans 'Remove' %}
{% endelement %}
{% endslot %}
{% endelement %}
</div>
<div class="mt-2 mb-6">
<button type="submit" name="action_primary" class="btn btn-sm btn-primary">{% trans 'Make Primary' %}</button>
<button type="submit" name="action_send" class="btn btn-sm btn-secondary">{% trans 'Re-send Verification' %}</button>
<button type="submit" name="action_remove" class="btn btn-sm btn-danger delete">{% trans 'Remove' %}</button>
</div>
</form>
{% else %}
{% include "account/snippets/warn_no_email.html" %}
{% endif %}
{% if can_add_email %}
{% element h2 %}
<p class="fs-8 fw-bold text-start">
{% trans "Add Email Address" %}
{% endelement %}
</p>
{% url 'account_email' as action_url %}
{% element form form=form method="post" action=action_url tags="email,add" %}
{% slot body %}
<form action="{{ action_url }}" method="POST" class="form email add">
{% csrf_token %}
{% element fields form=form %}
{% endelement %}
{% endslot %}
{% slot actions %}
{% element button name="action_add" type="submit" %}
{{ form|crispy }}
<button class="btn btn-sn btn-success w-100" type="submit" name="action_add">
{% trans "Add Email" %}
{% endelement %}
{% endslot %}
{% endelement %}
</button>
</form>
{% endif %}
{% endblock content %}
{% block extra_body %}
<script>
(function() {
var message = "{% trans 'Do you really want to remove the selected email address?' %}";
@ -87,4 +84,7 @@
}
})();
</script>
{% endblock extra_body %}
</div>
</div>
</div>
{% endblock content %}

View File

@ -1,39 +1,53 @@
{% extends "account/base_entrance.html" %}
{% load i18n %}
{% extends "base.html" %}
{% load i18n static %}
{% load account %}
{% load allauth %}
{% block head_title %}
{% trans "Confirm Email Address" %}
{% endblock head_title %}
{% block content %}
{% element h1 %}
{% trans "Confirm Email Address" %}
{% endelement %}
<div class="row ">
<div class="row flex-center min-vh-50">
<div class="col-sm-10 col-md-8 col-lg-5 col-xl-5 col-xxl-3">
<a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<img class="d-dark-none" src="{% static 'images/logos/logo-d.png' %}" alt="{% trans 'home' %}" width="58" />
<img class="d-light-none" src="{% static 'images/logos/logo.png' %}" alt="{% trans 'home' %}" width="58" />
</div>
</div>
</a>
<div class="text-center">
<h3 class="mb-4">{% trans "Confirm Email Address" %}</h3>
</div>
{% if confirmation %}
{% user_display confirmation.email_address.user as user_display %}
{% if can_confirm %}
{% element p %}
<p>
{% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href="mailto:{{ email }}">{{ email }}</a> is an email address for user {{ user_display }}.{% endblocktrans %}
{% endelement %}
</p>
{% url 'account_confirm_email' confirmation.key as action_url %}
{% element form method="post" action=action_url %}
{% slot actions %}
<form class="form" action="{{ action_url }}" method="post">
{% csrf_token %}
{{ redirect_field }}
{% element button type="submit" %}
<button class="btn btn-sm btn-phoenix-primary" type="submit">
{% trans 'Confirm' %}
{% endelement %}
{% endslot %}
{% endelement %}
</button>
</form>
{% else %}
{% element p %}
<p>
{% blocktrans %}Unable to confirm {{ email }} because it is already confirmed by a different account.{% endblocktrans %}
{% endelement %}
</p>
{% endif %}
{% else %}
{% url 'account_email' as email_url %}
{% element p %}
<p>
{% blocktrans %}This email confirmation link expired or is invalid. Please <a href="{{ email_url }}">issue a new email confirmation request</a>.{% endblocktrans %}
{% endelement %}
</p>
{% endif %}
</div>
</div>
</div>
{% endblock content %}

View File

@ -28,7 +28,7 @@
<Button class="btn btn-primary w-100 mb-5" type="submit">
{{ _("Verify") }}
</Button>
<a class="fs-9" href="">{{ _("Didnt receive the code?") }}</a>
<a class="fs-9" href="">{{ _("Didnt receive the code") }}</a>
</form>
</div>
</div>

View File

@ -14,23 +14,23 @@
</a>
<div class="text-center">
<h3 class="text-body-highlight">{% trans 'Sign Up' %}</h3>
<p class="text-body-tertiary">{% trans 'Create your account today' %}</p>
<p class="text-body-tertiary fs-9">{% trans 'Create your account today' %}</p>
</div>
<div class="text-start">
<div class="card theme-wizard" data-theme-wizard="data-theme-wizard">
<div class="card-header pt-3 pb-2 border-bottom-0">
<ul class="nav justify-content-between nav-wizard nav-wizard-success" role="tablist">
<li class="nav-item" role="presentation"><a class="nav-link active fw-semibold" href="#bootstrap-wizard-validation-tab1" data-bs-toggle="tab" data-wizard-step="1" aria-selected="true" role="tab">
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><svg class="svg-inline--fa fa-lock" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="lock" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M144 144v48H304V144c0-44.2-35.8-80-80-80s-80 35.8-80 80zM80 192V144C80 64.5 144.5 0 224 0s144 64.5 144 144v48h16c35.3 0 64 28.7 64 64V448c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V256c0-35.3 28.7-64 64-64H80z"></path></svg></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Access' %}</span></div>
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><span class="fa fa-lock"></span></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Access' %}</span></div>
</a></li>
<li class="nav-item" role="presentation"><a class="nav-link fw-semibold" href="#bootstrap-wizard-validation-tab2" data-bs-toggle="tab" data-wizard-step="2" aria-selected="false" tabindex="-1" role="tab">
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><svg class="svg-inline--fa fa-user" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="user" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z"></path></svg></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Account' %}</span></div>
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><span class="fa fa-user"></span></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Account' %}</span></div>
</a></li>
<li class="nav-item" role="presentation"><a class="nav-link fw-semibold" href="#bootstrap-wizard-validation-tab3" data-bs-toggle="tab" data-wizard-step="3" aria-selected="false" tabindex="-1" role="tab">
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><svg class="svg-inline--fa fa-file-lines" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="file-lines" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" data-fa-i2svg=""><path fill="currentColor" d="M64 0C28.7 0 0 28.7 0 64V448c0 35.3 28.7 64 64 64H320c35.3 0 64-28.7 64-64V160H256c-17.7 0-32-14.3-32-32V0H64zM256 0V128H384L256 0zM112 256H272c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16zm0 64H272c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16zm0 64H272c8.8 0 16 7.2 16 16s-7.2 16-16 16H112c-8.8 0-16-7.2-16-16s7.2-16 16-16z"></path></svg></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Extra' %}</span></div>
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><svg class="fa fa-file-lines"></svg></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Extra' %}</span></div>
</a></li>
<li class="nav-item" role="presentation"><a class="nav-link fw-semibold" href="#bootstrap-wizard-validation-tab4" data-bs-toggle="tab" data-wizard-step="4" aria-selected="false" tabindex="-1" role="tab">
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><svg class="svg-inline--fa fa-check" aria-hidden="true" focusable="false" data-prefix="fas" data-icon="check" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" data-fa-i2svg=""><path fill="currentColor" d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"></path></svg></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Done' %}</span></div>
<div class="text-center d-inline-block"><span class="nav-item-circle-parent"><span class="nav-item-circle"><span class="fa fa-check"></span></span></span><span class="d-none d-md-block mt-1 fs-9">{% trans 'Done' %}</span></div>
</a></li>
</ul>
</div>

View File

@ -1,14 +1,29 @@
{% extends "base.html" %}
{% load i18n %}
{% load i18n static%}
{% load allauth %}
{% block head_title %}
{% trans "Verify Your Email Address" %}
{% endblock head_title %}
{% block content %}
{% element h1 %}
<div class="row">
<div class="row flex-center min-vh-50 py-5">
<div class="col-sm-10 col-md-8 col-lg-5 col-xxl-4">
<a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<img class="d-dark-none" src="{% static 'images/logos/logo-d.png' %}" alt="{% trans 'home' %}" width="58" />
<img class="d-light-none" src="{% static 'images/logos/logo.png' %}" alt="{% trans 'home' %}" width="58" />
</div>
</a>
<h3>
{% trans "Verify Your Email Address" %}
{% endelement %}
{% element p %}
</h3>
<p>
{% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %}
{% endelement %}
</p>
</div>
</div>
</div>
{% endblock content %}

View File

@ -1,14 +1,27 @@
{% extends "account/base_entrance.html" %}
{% load i18n %}
{% extends "base.html" %}
{% load i18n static %}
{% load allauth %}
{% block head_title %}
{% trans "Verify Your Email Address" %}
{% endblock head_title %}
{% block content %}
{% element h1 %}
<div class="row">
<div class="row flex-center min-vh-50 py-5">
<div class="col-sm-10 col-md-8 col-lg-5 col-xxl-4">
<a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<img class="d-dark-none" src="{% static 'images/logos/logo-d.png' %}" alt="{% trans 'home' %}" width="58" />
<img class="d-light-none" src="{% static 'images/logos/logo.png' %}" alt="{% trans 'home' %}" width="58" />
</div>
</a>
<h3>
{% trans "Verify Your Email Address" %}
{% endelement %}
{% element p %}
</h3>
<p>
{% blocktrans %}We have sent an email to you for verification. Follow the link provided to finalize the signup process. If you do not see the verification email in your main inbox, check your spam folder. Please contact us if you do not receive the verification email within a few minutes.{% endblocktrans %}
{% endelement %}
</p>
</div>
</div>
</div>
{% endblock content %}

View File

@ -1,25 +1,38 @@
{% extends "account/base_manage.html" %}
{% load i18n %}
{% extends "base.html" %}
{% load i18n static%}
{% load allauth %}
{% block head_title %}
{% trans "Verify Your Email Address" %}
{% endblock head_title %}
{% block content %}
{% element h1 %}
<div class="row">
<div class="row flex-center min-vh-50 py-5">
<div class="col-sm-10 col-md-8 col-lg-5 col-xxl-4">
<a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">
<div class="d-flex align-items-center fw-bolder fs-3 d-inline-block">
<img class="d-dark-none" src="{% static 'images/logos/logo-d.png' %}" alt="{% trans 'home' %}" width="58" />
<img class="d-light-none" src="{% static 'images/logos/logo.png' %}" alt="{% trans 'home' %}" width="58" />
</div>
</a>
<h3>
{% trans "Verify Your Email Address" %}
{% endelement %}
</h3>
{% url 'account_email' as email_url %}
{% element p %}
<p>
{% blocktrans %}This part of the site requires us to verify that
you are who you claim to be. For this purpose, we require that you
verify ownership of your email address. {% endblocktrans %}
{% endelement %}
{% element p %}
</p>
<p>
{% blocktrans %}We have sent an email to you for
verification. Please click on the link inside that email. If you do not see the verification email in your main inbox, check your spam folder. Otherwise
contact us if you do not receive it within a few minutes.{% endblocktrans %}
{% endelement %}
{% element p %}
</p>
<p>
{% blocktrans %}<strong>Note:</strong> you can still <a href="{{ email_url }}">change your email address</a>.{% endblocktrans %}
{% endelement %}
</p>
</div>
</div>
</div>
{% endblock content %}

View File

@ -84,17 +84,27 @@
<section class="bg-body-emphasis pb-8" id="home">
<div class="row-small hero-header-row px-lg-7 px-xxl-3">
<div class="row align-items-center">
<div class="col-12 col-lg-6 text-lg-start text-center pt-8 pb-6">
<div class="container-fluid ps-3"
style="
background: linear-gradient(rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.5)), url('{% static 'images/logos/hero_02.png' %}');
background-size: cover;
background-position: center;
padding: 220px 0 0 0;">
<h1 class="fs-3 fs-lg-2 fs-md-1 fs-xl-1 fw-black mb-4">
<span class="text-primary me-3">{% trans 'Streamline' %}</span>{% trans 'Your Car Dealership Operations' %}
<span class="text-primary me-3">{% trans 'Streamline' %}</span>&nbsp;{% trans 'Your Car Dealership Operations' %}
</h1>
<p class="mb-5">{% trans 'Manage inventory, sales, transfers, and accounting seamlessly with Haikal.' %}</p>
<a class="btn btn-lg btn-primary rounded-pill me-3" href="{% url 'account_signup' %}" role="button">{% trans 'Get Started' %}</a>
<a class="btn btn-link fs-8 p-0" href="#feature" role="button">{% trans 'Learn More' %}<span class="fa-solid fa-angle-right ms-2 fs-9"></span></a>
</div>
<div class="col-12 col-lg-6 text-center">
<img class="w-100 shadow-lg rounded-2" src="{% static 'images/bg/haikal-dashboard.png' %}" alt="Haikal Dashboard" />
<a class="btn btn-link fs-8 p-0" href="#feature" role="button">{% trans 'Learn More' %}
{% if LANGUAGE_CODE == 'ar' %}
<span class="fa-solid fa-angle-left ms-2 fs-9"></span>
{% else %}
<span class="fa-solid fa-angle-right ms-2 fs-9"></span>
{% endif %}
</a>
</div>
</div>
</div>
</section>
@ -107,17 +117,17 @@
</div>
<div class="row">
<div class="col-md-4 text-center">
<img src="{% static 'images/icons/inventory.png' %}" alt="Inventory Management" class="mb-3" width="60">
<img src="{% static 'images/icons/35420_store.svg' %}" alt="Inventory Management" class="mb-3" width="60">
<h5>{% trans 'Inventory Management' %}</h5>
<p>{% trans 'Effortlessly manage your car inventory with real-time updates and intuitive tools.' %}</p>
</div>
<div class="col-md-4 text-center">
<img src="{% static 'images/icons/accounting.png' %}" alt="Seamless Accounting" class="mb-3" width="60">
<img src="{% static 'images/icons/148542_list.svg' %}" alt="Seamless Accounting" class="mb-3" width="60">
<h5>{% trans 'Seamless Accounting' %}</h5>
<p>{% trans 'Integrated double-entry accounting tailored for car dealers.' %}</p>
</div>
<div class="col-md-4 text-center">
<img src="{% static 'images/icons/analytics.png' %}" alt="Advanced Analytics" class="mb-3" width="60">
<img src="{% static 'images/icons/114292_report.svg' %}" alt="Advanced Analytics" class="mb-3" width="60">
<h5>{% trans 'Advanced Analytics' %}</h5>
<p>{% trans 'Gain insights and make data-driven decisions for your business.' %}</p>
</div>
@ -131,36 +141,20 @@
<h2 class="mb-3 text-body-emphasis lh-base">{% trans 'Choose the Plan that Fits Your Business' %}</h2>
<p class="mb-5">{% trans 'Flexible pricing plans designed to meet the unique needs of every dealership.' %}</p>
<div class="row">
{% for plan in plans %}
<div class="col-md-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">{% trans 'Basic' %}</h5>
<p class="card-text">{% trans 'Essential tools to get your dealership started.' %}</p>
<p class="h4">$29/month</p>
<a href="{% url 'account_signup' %}" class="btn btn-primary mt-3">{% trans 'Get Started' %}</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">{% trans 'Pro' %}</h5>
<p class="card-text">{% trans 'Advanced features for growing dealerships.' %}</p>
<p class="h4">$59/month</p>
<a href="{% url 'account_signup' %}" class="btn btn-primary mt-3">{% trans 'Get Started' %}</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card shadow-sm">
<div class="card-body">
<h5 class="card-title">{% trans 'Enterprise' %}</h5>
<p class="card-text">{% trans 'Comprehensive solutions for large-scale operations.' %}</p>
<p class="h4">$99/month</p>
<h5 class="card-title">{{plan.name }}</h5>
<p class="card-text">{{ plan.description }}</p>
<p class="h4">{{ plan.price }}</p>
<a href="{% url 'account_signup' %}" class="btn btn-primary mt-3">{% trans 'Get Started' %}</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</section>