From 95a17213154418373b96fa5abb7bc889af09a87a Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 6 Feb 2026 17:02:42 +0000 Subject: [PATCH] Autosave: 20260206-170242 --- add_reviews.py | 35 ++ config/__pycache__/settings.cpython-311.pyc | Bin 6549 -> 6617 bytes config/__pycache__/urls.cpython-311.pyc | Bin 1220 -> 1323 bytes config/settings.py | 3 + config/urls.py | 3 +- core/__pycache__/admin.cpython-311.pyc | Bin 2515 -> 2933 bytes .../context_processors.cpython-311.pyc | Bin 763 -> 934 bytes core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 3696 bytes core/__pycache__/models.cpython-311.pyc | Bin 7569 -> 12191 bytes core/__pycache__/translation.cpython-311.pyc | Bin 1273 -> 1590 bytes core/__pycache__/urls.cpython-311.pyc | Bin 1361 -> 2772 bytes core/__pycache__/views.cpython-311.pyc | Bin 8481 -> 21612 bytes core/admin.py | 11 +- core/context_processors.py | 5 +- core/forms.py | 37 ++ ...slot_order_kebele_productimage_and_more.py | 48 +++ core/migrations/0004_article.py | 31 ++ ..._content_am_article_content_en_and_more.py | 43 +++ core/migrations/0006_vendor_kebele.py | 18 + ...bele_productimage_and_more.cpython-311.pyc | Bin 0 -> 3549 bytes .../__pycache__/0004_article.cpython-311.pyc | Bin 0 -> 2121 bytes ...rticle_content_en_and_more.cpython-311.pyc | Bin 0 -> 1498 bytes .../0006_vendor_kebele.cpython-311.pyc | Bin 0 -> 1072 bytes core/models.py | 90 ++++- core/templates/base.html | 359 ++++++++++-------- core/templates/core/about_us.html | 172 +++++++++ core/templates/core/article_detail.html | 77 +++- core/templates/core/article_list.html | 70 ++++ core/templates/core/cart_detail.html | 170 +++++---- core/templates/core/category_products.html | 129 +++++-- core/templates/core/checkout.html | 175 ++++++--- core/templates/core/contact_us.html | 109 ++++++ core/templates/core/delivery_info.html | 115 ++++++ core/templates/core/how_it_works.html | 103 +++++ core/templates/core/index.html | 239 ++++++++++-- core/templates/core/order_success.html | 69 ++-- core/templates/core/product_detail.html | 301 +++++++++++++-- core/templates/core/product_list.html | 183 +++++++-- core/templates/core/seller_info.html | 153 ++++++++ core/templates/core/track_order.html | 91 +++++ core/templates/core/vendor_dashboard.html | 342 +++++++++++------ .../core/vendor_product_confirm_delete.html | 34 ++ core/templates/core/vendor_product_form.html | 132 +++++++ core/templates/core/vendor_register.html | 32 +- core/templates/registration/login.html | 63 +++ core/templates/registration/signup.html | 70 ++++ core/translation.py | 6 +- core/urls.py | 20 + core/views.py | 272 ++++++++++++- populate_db.py | 175 ++++++--- 50 files changed, 3318 insertions(+), 667 deletions(-) create mode 100644 add_reviews.py create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0003_order_delivery_time_slot_order_kebele_productimage_and_more.py create mode 100644 core/migrations/0004_article.py create mode 100644 core/migrations/0005_article_content_am_article_content_en_and_more.py create mode 100644 core/migrations/0006_vendor_kebele.py create mode 100644 core/migrations/__pycache__/0003_order_delivery_time_slot_order_kebele_productimage_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0004_article.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0005_article_content_am_article_content_en_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0006_vendor_kebele.cpython-311.pyc create mode 100644 core/templates/core/about_us.html create mode 100644 core/templates/core/article_list.html create mode 100644 core/templates/core/contact_us.html create mode 100644 core/templates/core/delivery_info.html create mode 100644 core/templates/core/how_it_works.html create mode 100644 core/templates/core/seller_info.html create mode 100644 core/templates/core/track_order.html create mode 100644 core/templates/core/vendor_product_confirm_delete.html create mode 100644 core/templates/core/vendor_product_form.html create mode 100644 core/templates/registration/login.html create mode 100644 core/templates/registration/signup.html diff --git a/add_reviews.py b/add_reviews.py new file mode 100644 index 0000000..df70f01 --- /dev/null +++ b/add_reviews.py @@ -0,0 +1,35 @@ +import os +import django + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings') +django.setup() + +from core.models import Product, ProductReview +from django.contrib.auth.models import User + +def add_reviews(): + products = Product.objects.all() + if not products.exists(): + print("No products found.") + return + + reviews_data = [ + {"product_idx": 0, "name": "Chala Jimma", "rating": 5, "comment": "Excellent quality! Highly recommended for anyone in Jimma."}, + {"product_idx": 0, "name": "Aster K.", "rating": 4, "comment": "Very good service and the product is as described."}, + {"product_idx": 1 if products.count() > 1 else 0, "name": "Dawit H.", "rating": 5, "comment": "Fast delivery to Kochi and great price."}, + {"product_idx": 2 if products.count() > 2 else 0, "name": "Mulu B.", "rating": 3, "comment": "Decent product, but took a bit longer to arrive."}, + ] + + for data in reviews_data: + p = products[data["product_idx"]] + ProductReview.objects.create( + product=p, + full_name=data["name"], + rating=data["rating"], + comment=data["comment"] + ) + + print(f"Created {len(reviews_data)} sample reviews.") + +if __name__ == "__main__": + add_reviews() diff --git a/config/__pycache__/settings.cpython-311.pyc b/config/__pycache__/settings.cpython-311.pyc index cf8b83e431fed2dba3774e09b7fa258642372b66..89a4b70e13bef52a35e00b8ee7d836510e70ef1d 100644 GIT binary patch delta 148 zcmbPgeAAe3IWI340}y=t)RL(tGLcV$v1X%s2^()vlygc@luHV8FoS0B<^^o$xj1jJ zX6B`&R%p6zE)@L0qg%`4c>b1`W;Z*CC$z@$JNk?-gNX<-Wim1Vmt^0CRE~J^%m! diff --git a/config/__pycache__/urls.cpython-311.pyc b/config/__pycache__/urls.cpython-311.pyc index ecb172192e3eff51e6a3dc70a3e2a1a7306fcb74..7b44cfbfe378c44f5c96153b6930a20acc36049f 100644 GIT binary patch delta 198 zcmX@YxtdFTIWI340}#yn)RMWCiGkrUhyw%MP{!w78`YT^d6*bdnNvU{OA7B~K1Nwq zW(J1U%##fmtr__yFJKgz+`uRgW{Gn02Q#Dqv8KS}eT=1wRh)^*$@!&uCB^zx5-C}U zdFlCj$@zIDMVU!@iKQhOdYko`+!z@XCYLdv5|N&eJ|X>roW(^k%PV4*7g?;XuvksD dVv!PJXAxlf!T=;bGO#c*HE@66nViNF2LNFOG1UM7 delta 135 zcmZ3@b%axWIWI340}wp#Z_Z3(Vqka-;=lk{2FUq5X`?zbcPaLe?d_an>~5*rh!B+9E|g33sEp8PG`S;^XAR>-hOZTQTvgIzKBG6 z5Ff9;G|jhxRx~9=rB)^zt|&_iMiL@;E!>JKtnI)x}Gp?MYj#;t@TaXq*F&@2xsmgYwW-!VZG|DdfE(BAax#FuB!`##*I>cXY zv~CkxC;(QA6_VG3G!Bs(Kpz04cNNRDox+M~IfS|qn-poO%$LM6Y?_29K|cW2pa6E& zKjGyZWUKy1SY_}0(;FGsO9PB^;5DfH1ECfPtR?H!tAbHUC0GMOvfT_uvmA>HR^^< zyRcqg=FKP*L*&b8Tk(=}mkAZ)U{gdOq4`bXx zBW=XSL!;9V+vvaN8#{Ch8&a&%-yGhOcX4VDr}ia3zO;`{Lt7g=0QYx*10RwGj-$f} Y2b(>gkoEy-Tl2eUXb%mwkEW387Zo@CLjV8( delta 749 zcmb7C&ubGw6rP#vuV%BmY11ZcZE1*>Hh~7w(n8Tx;}R`g<; z1_7O=!@^UJe>={I2$xU*$14+THm5odNWBOvY@TYc&6ePsQid;V)o?`0Tgq)XWdqF; z2X4WBZb7T0=0UD&ObfHl_!YRWREopsA3;C`J_?&kb*zl0yfKc}qy%`TG*X&L_^RBe zHaP0y&K$NWJ$;GMdh zs@LEkHvv>zTF!8pA~8|BJ=Y5o)qC3Koh(%YsTvS!vnf?WQhm^(_6>~OL|7DX=|hnu z(fu&+LodoIG?AhSk-kun{ljy+J_@gmt)0Z+-XlNidz{M;BioAACDumg;cn33cO@y8 z3i*3jNXzZ|AxD-(iF|SOVsri)w?w_Wfw#(UiySIe^a*-H&F1H diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc index 75bf2234fb21a6b62efc5cec11af9512dd0c9616..d50b43caf6b9df3f8ea4cf2cfcf5616e20c4cb93 100644 GIT binary patch delta 431 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 bk@%SEpH>@pw$MU15@Qgkf7+yxqy7H^JA7A0 delta 2789 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 delta 4092 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 literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0004_article.cpython-311.pyc b/core/migrations/__pycache__/0004_article.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cfe09c8426b58e09cd06b5804ffd73e7b23cae4d GIT binary patch literal 2121 zcmZuyy>Ht_6hBfDCCYLvCAJkQZdC(86FG(zAZY`nK@v%})3o`l?KDvbg3_I3$`q;a z!;Ui)9x`OiR*#+B7WUwwgNObB87Y8+a8rQ-1+pnfrY!Bdqo~GBj^y!o_kMg|_wM-1 z=x7o_d;a$`EgM7VFE$7pjCp(W5MDnajIf}in!w*8e~Wsg9j!$LCX48?wp5ea@mgF! zBD#Ta^cli2BDE3&J!m(A&>lQNt0l0ogo@HDHoQ|5Xu>9rqZv)RDAHtGYg($KnTAcJ zwuy;uHwNGFS7tDHBZ|y7!u_g=SP&73w4x!E#9C5_cLlHxPtclTEzY?^@34p?FeA5k zMi>i6;fi5tKfVhZ_l8a)wQRDrodX=w25M< zZ9-#?=IG?rKM*QZda|uPQFLN7oi!S@b+-vF$LhLjtW(J~w8t)3ZkUEc42Q@|YHN*t3_)zuxE9QdlJfZYyeegkG( zj)!8Hn^Xd{W?C>auv3gs*)&+*hy&4BMCYIJXhg?kN#T7a0awwxYo#@_O-gRvH5|7@o{$DOZk0AoYu)as4N_udTl(+l zD?tHYR0b%*Sm?bpD6cZk#TAJ zRzHR00+W5(%jEyeOnBLu7aM+d<}mv5v{zF+!}79rH*5P@+eWj}w}OMlhNWW8K*XVT9V52A<5Uar#3Rs3AVOIJa!H#NJn=ugddr{?^rIWJw} zdd@LD=MGLEF2DT2%RlPoANl!5Ub@!H6ujw+KTrD87Y|pw>1ubn>Q7g_^n5S#iC4I= zv*8ym94`KG%fE8pzp~;L9&`&2{K5k-{r&rdWv@`_7Ak%r@FC}&n%()*KQ()>@%xs4 z>4tylo`30~*L>`4{P-53P2sNCM`-Gv_?q`H1sG;B_r?B+1 zWg5gk2#@3k@G}zWifCITq;!swDhS-)>IECgfs>t^^? zL+FbXs!FgxEjY*6wgTsX`J3k${|gw6KgVe5o=Go2fiDX4 zSyfpmvlgVBiSfC)xqHOtSr|l2)GNjc(j;R^M*Mii!9q*&C~{P24cQJP@nZ&SlGfHj z7Ev+OXUQ3##=^+LEMkCi_zkjDHkZFnB9=6>79WG9N(1Z$x@o-RSi&Hs7ea(Z2zbo_ zg@|!NUgmxzJxhtQ4ofIYf{=B&>}O#-p!AW9h{Hue!dzkNSt$$iVaw-z)=E2U(BL1@ zG3cSwHMf<<%*|KxB+Fg4&VoEkx%(>RFS;E+V6IG-dv-BgNZWjsHgcA%ktLQ8KcR2} z&SpEWxem@sBAMNujBf6HuICVzVSppe6q^&lA{Te zw*91;&eGMgMastL*Wrd#D|M%UJ2e*ieRiKugDC$`-RD3G6=Mvw!OkAKJNg#-ZLAk) Tlx$hOOSg{X#>r21OTXU%=<;Yo literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0006_vendor_kebele.cpython-311.pyc b/core/migrations/__pycache__/0006_vendor_kebele.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..059cbade2f50da5f48c4eee581615d8d851de4e9 GIT binary patch literal 1072 zcmZuvyH6BB7@yhK-7a?m2Z=G7ctLzz!;u(`1u;>h5D*%O#Wj<;osYY{+ub>5cM&@Z z3QIbA3m=g`#lnJuY->efvIrHGGrM;f#C`ns`+cwd<@@Gywdx>w{rRLBBt#krUUNjqoPmJ`gXxuIy2T$!#q~uhL$>k*AX=K zco?Ntz!~_FJE~M)dq_^((%46UT9~1h#&8F>bPa*g8;O#?X3AsrO2Zn&j1FSvN6f5) z(q$P3<;z@lD>GXPb5eVCq)5s$TrMDeI6puCh)@xGt`EfJVGLnRXmG^^A)z57fhw}L zAY@#mRv+5n!$!ktXy?vz9?|+U#=J<3NtqX}6)%ptsN}BHT=c>o7u6!6lC%0^!V-~) zYehe32x>V#mb@)K) z&JWF3bSi`B{AIJt1864gB#e_LY=fJ~AvE7{(T@hyg{E3$^Y3A6%9TDQ#fnI=p}E0( zVaZ-OC?ndEuyb)|7P6OcrfbvI&g;xU_N@=jVfp6K_1j02H;!sEd-o1&Ghe1Ngr01e z{~$G)a!rAGlH*y9S;?@S6C~kGL8e(Q{o=U6+ROg@i7>K&Dq z=iZgpd3m82?^AJKQY_!-jf70c7)$xM@dG`$`earGTN%0vd(Pp+?1>7T{U@6L_YcF6 B8yNrq literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 2db87a3..4b085a9 100644 --- a/core/models.py +++ b/core/models.py @@ -2,6 +2,8 @@ from django.db import models from django.contrib.auth.models import User from django.utils.text import slugify from django.utils import timezone +from django.core.validators import MinValueValidator, MaxValueValidator +from django.db.models import Avg class Category(models.Model): name = models.CharField(max_length=100) @@ -21,10 +23,24 @@ class Category(models.Model): super().save(*args, **kwargs) class Vendor(models.Model): + JIMMA_KEBELES = ( + ('Bosa Addis', 'Bosa Addis'), + ('Bosa Kitto', 'Bosa Kitto'), + ('Ginjo', 'Ginjo'), + ('Ginjo Guduru', 'Ginjo Guduru'), + ('Hermata', 'Hermata'), + ('Hermata Merkato', 'Hermata Merkato'), + ('Jiren', 'Jiren'), + ('Kofe', 'Kofe'), + ('Mendera Kochi', 'Mendera Kochi'), + ('Seto Semero', 'Seto Semero'), + ) + user = models.OneToOneField(User, on_delete=models.CASCADE) business_name = models.CharField(max_length=255) description = models.TextField(blank=True) address = models.CharField(max_length=255) + kebele = models.CharField(max_length=100, choices=JIMMA_KEBELES, blank=True) phone = models.CharField(max_length=20) is_verified = models.BooleanField(default=False) created_at = models.DateTimeField(default=timezone.now) @@ -37,7 +53,7 @@ class Product(models.Model): vendor = models.ForeignKey(Vendor, related_name='products', on_delete=models.CASCADE) name = models.CharField(max_length=255) slug = models.SlugField(unique=True, blank=True) - image = models.ImageField(upload_to='products/', blank=True, null=True) + image = models.ImageField(upload_to='products/', blank=True, null=True) # Main image description = models.TextField() price = models.DecimalField(max_digits=10, decimal_places=2) stock = models.IntegerField(default=0) @@ -53,6 +69,34 @@ class Product(models.Model): self.slug = slugify(self.name) super().save(*args, **kwargs) + @property + def average_rating(self): + avg = self.reviews.aggregate(Avg('rating'))['rating__avg'] + return round(avg, 1) if avg else 0 + + @property + def review_count(self): + return self.reviews.count() + +class ProductImage(models.Model): + product = models.ForeignKey(Product, related_name='images', on_delete=models.CASCADE) + image = models.ImageField(upload_to='products/gallery/') + alt_text = models.CharField(max_length=255, blank=True) + + def __str__(self): + return f"Image for {self.product.name}" + +class ProductReview(models.Model): + product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) # Optional user + full_name = models.CharField(max_length=255) # For guests + rating = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) + comment = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) + + def __str__(self): + return f"Review for {self.product.name} by {self.full_name}" + class Profile(models.Model): ROLE_CHOICES = ( ('customer', 'Customer'), @@ -75,11 +119,35 @@ class Order(models.Model): ('Delivered', 'Delivered'), ('Cancelled', 'Cancelled'), ) + + JIMMA_KEBELES = ( + ('Bosa Addis', 'Bosa Addis'), + ('Bosa Kitto', 'Bosa Kitto'), + ('Ginjo', 'Ginjo'), + ('Ginjo Guduru', 'Ginjo Guduru'), + ('Hermata', 'Hermata'), + ('Hermata Merkato', 'Hermata Merkato'), + ('Jiren', 'Jiren'), + ('Kofe', 'Kofe'), + ('Mendera Kochi', 'Mendera Kochi'), + ('Seto Semero', 'Seto Semero'), + # Add more as needed + ) + + TIME_SLOTS = ( + ('Morning', 'Morning (8:00 AM - 12:00 PM)'), + ('Afternoon', 'Afternoon (12:00 PM - 5:00 PM)'), + ('Evening', 'Evening (5:00 PM - 8:00 PM)'), + ) + user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) full_name = models.CharField(max_length=255) email = models.EmailField(blank=True) phone = models.CharField(max_length=20) address = models.TextField() + kebele = models.CharField(max_length=100, choices=JIMMA_KEBELES, blank=True) + delivery_time_slot = models.CharField(max_length=50, choices=TIME_SLOTS, default='Morning') + total_price = models.DecimalField(max_digits=10, decimal_places=2) payment_method = models.CharField(max_length=50) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='Pending') @@ -99,4 +167,22 @@ class OrderItem(models.Model): @property def total_price(self): - return self.price * self.quantity \ No newline at end of file + return self.price * self.quantity + +class Article(models.Model): + title = models.CharField(max_length=255) + slug = models.SlugField(unique=True, blank=True) + content = models.TextField() + image = models.ImageField(upload_to='articles/', blank=True, null=True) + author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='articles') + is_published = models.BooleanField(default=False) + created_at = models.DateTimeField(default=timezone.now) + updated_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return self.title + + def save(self, *args, **kwargs): + if not self.slug: + self.slug = slugify(self.title) + super().save(*args, **kwargs) diff --git a/core/templates/base.html b/core/templates/base.html index 9c7a16f..2e2f842 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,169 +1,222 @@ {% load i18n static %} - - - - {% block title %}{% trans "Ethio-Marketplace" %}{% endblock %} - - {% if project_description %} - - - - {% endif %} - - {% if project_image_url %} - - - {% endif %} - - - - - - - - - - {% block head %}{% endblock %} + + + {% block title %}{% trans "Jimma Market - Your Local Online Marketplace" %}{% endblock %} + + + + + + + + + + {% block extra_css %}{% endblock %} - - - {% if messages %} -
- {% for message in messages %} - - {% endif %} + -
- {% block content %}{% endblock %} -
+ +
+ {% if messages %} +
+ {% for message in messages %} + + {% endfor %} +
+ {% endif %} -
-
-
-
-
{% trans "Ethio-Market" %}
-

{% trans "Connecting Ethiopian local vendors with customers everywhere." %}

+ {% block content %}{% endblock %} +
+ + +
- - + - - - {% block scripts %}{% endblock %} + + + {% block extra_js %}{% endblock %} - - \ No newline at end of file + diff --git a/core/templates/core/about_us.html b/core/templates/core/about_us.html new file mode 100644 index 0000000..44bbcf3 --- /dev/null +++ b/core/templates/core/about_us.html @@ -0,0 +1,172 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+ +
+
+

{% trans "Empowering Jimma's Local Commerce" %}

+

+ {% trans "Jimma Market is the city's premier digital marketplace, dedicated to connecting local businesses with their community through technology and seamless delivery." %} +

+ +
+
+
+
+ Jimma Culture +
+
+
+ + +
+
+

{% trans "Our Story" %}

+

+ {% trans "Born in the heart of the world's coffee birthplace, Jimma Market started with a simple vision: to make everyday shopping effortless for every resident of Jimma. We believe that by digitizing local trade, we can support Jimma's economy while providing unmatched convenience to consumers." %} +

+
+
+ + +
+
+
+
+ {% trans "Our Mission" %} +
+

{% trans "Connecting Jimma" %}

+

+ {% trans "To provide a reliable, fast, and user-friendly platform that bridges the gap between Jimma's diverse sellers and the digital consumer, ensuring quality products reach every Kebele within hours." %} +

+
+
+
+
+
+ {% trans "Our Vision" %} +
+

{% trans "The Hub of Commerce" %}

+

+ {% trans "To become the leading e-commerce ecosystem in Jimma and the Oromia region, setting the standard for local delivery networks and digital marketplace trust." %} +

+
+
+
+ + +
+

{% trans "Why Shop With Us?" %}

+
+
+
+
+
{% trans "Local Support" %}
+

{% trans "Directly supporting businesses in Jimma city." %}

+
+
+
+
+
+
{% trans "Fast Delivery" %}
+

{% trans "Same-day delivery to all Jimma Kebeles." %}

+
+
+
+
+
+
{% trans "Trusted Quality" %}
+

{% trans "Verified sellers and quality-checked products." %}

+
+
+
+
+
+
{% trans "Multi-Language" %}
+

{% trans "Afaan Oromoo, Amharic, and English support." %}

+
+
+
+
+ + +
+
+

{% trans "Meet Our Team" %}

+

{% trans "The people working behind the scenes to modernize Jimma's marketplace." %}

+
+ +
+ +
+
+
+
+ B +
+
+

Bilal

+ {% trans "Lead Developer" %} +
+
+

+ {% trans "Passionate about building scalable digital solutions that solve real-world problems for the Jimma community." %} +

+ +
+
+ + +
+
+
+
+
+
{% trans "Logistics & Ops" %}
+

{% trans "Managing delivery zones and rider networks across all Kebeles." %}

+
+
+
+
+
+
{% trans "Customer Success" %}
+

{% trans "Providing local support in Afaan Oromoo and Amharic." %}

+
+
+
+
+
+
{% trans "Vendor Relations" %}
+

{% trans "Onboarding and supporting Jimma's local businesses." %}

+
+
+
+
+

{% trans "Interested in joining our mission?" %}

+ {% trans "Work with us" %} +
+
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/article_detail.html b/core/templates/core/article_detail.html index 8820990..57a7a47 100644 --- a/core/templates/core/article_detail.html +++ b/core/templates/core/article_detail.html @@ -1,14 +1,75 @@ {% extends 'base.html' %} +{% load static %} -{% block title %}{{ article.title }}{% endblock %} +{% block title %}{{ article.title }} - Jimma Market Blog{% endblock %} {% block content %} -
-

{{ article.title }}

-

Published on {{ article.created_at|date:"F d, Y" }}

-
-
- {{ article.content|safe }} +
+
+
+
+ +
+ +

{{ article.title }}

+
+
+ + {{ article.author.get_full_name|default:article.author.username }} +
+
+ + {{ article.created_at|date:"F d, Y" }} +
+
+
+ + + {% if article.image %} +
+ {{ article.title }} +
+ {% endif %} + + +
+ {{ article.content|safe|linebreaks }} +
+ + +
+
+
+ Share this story: +
+ + + + +
+
+ + Back to Blog + +
+
+
-
+ + + {% endblock %} diff --git a/core/templates/core/article_list.html b/core/templates/core/article_list.html new file mode 100644 index 0000000..4c6d032 --- /dev/null +++ b/core/templates/core/article_list.html @@ -0,0 +1,70 @@ +{% extends 'base.html' %} +{% load static %} + +{% block title %}Market News & Blog - Jimma Market{% endblock %} + +{% block content %} + +
+
+

Market News & Blog

+

Stay updated with the latest trends, vendor stories, and market updates in Jimma.

+
+
+ + +
+
+
+ {% for article in articles %} +
+
+ {% if article.image %} + {{ article.title }} + {% else %} +
+ +
+ {% endif %} +
+
+ {{ article.created_at|date:"M d, Y" }} + | + {{ article.author.get_full_name|default:article.author.username }} +
+
+ + {{ article.title }} + +
+

+ {{ article.content|striptags|truncatewords:20 }} +

+
+ +
+
+ {% empty %} +
+
+ +
+

No articles found

+

Check back later for new updates and stories from Jimma Market.

+ Return Home +
+ {% endfor %} +
+
+
+ + +{% endblock %} diff --git a/core/templates/core/cart_detail.html b/core/templates/core/cart_detail.html index a24a543..eca4dfd 100644 --- a/core/templates/core/cart_detail.html +++ b/core/templates/core/cart_detail.html @@ -1,81 +1,111 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{% trans "Shopping Cart" %}{% endblock %} +{% block title %}{% trans "Shopping Cart" %} | Jimma Market{% endblock %} {% block content %} -
-

{% trans "Your Shopping Cart" %}

+
+
+

{% trans "Your Shopping Cart" %} 🛒

- {% if cart_items %} -
-
-
- - - - - - - - - - - - {% for item in cart_items %} - - - - - - - - {% endfor %} - -
{% trans "Product" %}{% trans "Price" %}{% trans "Quantity" %}{% trans "Subtotal" %}
-
- {% if item.product.image %} - {{ item.product.name }} - {% endif %} -
-
{{ item.product.name }}
- {{ item.product.vendor.business_name }} -
-
-
{{ item.product.price }} ETB{{ item.quantity }}{{ item.subtotal }} ETB - - {% trans "Remove" %} - -
+ {% if cart_items %} +
+
+
+
+ + + + + + + + + + + {% for item in cart_items %} + + + + + + + {% endfor %} + +
{% trans "Product" %}{% trans "Quantity" %}{% trans "Subtotal" %}
+
+
+ {% if item.product.image %} + + {% else %} +
+ +
+ {% endif %} +
+
+
+ {{ item.product.name }} +
+ {{ item.product.category.name }} +
+
+
+
+ {{ item.quantity }} +
+
+ {{ item.subtotal }} ETB + + + + +
+
+
+ + +
+ +
+
+
{% trans "Cart Total" %}
+
+ {% trans "Subtotal" %} + {{ total }} ETB +
+
+ {% trans "Delivery" %} + {% trans "Calculated at checkout" %} +
+
+
+ {% trans "Total" %} + {{ total }} ETB +
+ + {% trans "Proceed to Checkout" %} + +

+ {% trans "Secure & Easy Guest Checkout" %} +

+
-
-
-

{% trans "Order Summary" %}

-
- {% trans "Subtotal" %} - {{ total }} ETB -
-
- {% trans "Shipping" %} - {% trans "Free" %} -
-
-
- {% trans "Total" %} - {{ total }} ETB -
- - {% trans "Proceed to Checkout" %} - + {% else %} +
+
+
+

{% trans "Your cart is empty" %}

+

{% trans "Looks like you haven't added anything to your cart yet." %}

+ {% trans "Start Shopping" %}
+ {% endif %}
- {% else %} -
-

{% trans "Your cart is empty." %}

- {% trans "Start Shopping" %} -
- {% endif %} -
-{% endblock %} +
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/category_products.html b/core/templates/core/category_products.html index e5bf750..580356c 100644 --- a/core/templates/core/category_products.html +++ b/core/templates/core/category_products.html @@ -1,46 +1,105 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{{ category.name }}{% endblock %} +{% block title %}{{ category.name }} | Jimma Market{% endblock %} {% block content %} -
-
-

{{ category.name }}

- {% if category.description %} -

{{ category.description }}

- {% endif %} -
+
+
+ -
- {% for product in products %} -
-
- {% if product.image %} - {{ product.name }} - {% else %} -
- {% trans "No Image" %} -
+
+
+

{{ category.name }}

+ {% if category.description %} +

{{ category.description }}

{% endif %} - +
{{ products.count }} {% trans "Products" %}
+
+
+
+
+ + +
+
- {% empty %} -
-

{% trans "No products available in this category yet." %}

+ + {% if current_kebele %} +
+ + + {% trans "Showing" %} {{ category.name }} {% trans "from vendors in" %} {{ current_kebele }} + + {% trans "Clear Filter" %} +
+ {% endif %} + +
+ {% for product in products %} +
+
+ {% if product.image %} + {{ product.name }} + {% else %} +
+ +
+ {% endif %} +
+
+ {% if product.review_count > 0 %} +
+ {{ product.average_rating }} +
+ {% else %} + {% trans "No reviews" %} + {% endif %} + {{ product.vendor.kebele }} +
+
+ + {{ product.name }} + +
+

{{ product.description|striptags }}

+
+ {{ product.price }} ETB + + + +
+
+
+
+ {% empty %} +
+ +

{% trans "No products found" %}

+

{% trans "Try adjusting your filters or check back later." %}

+ {% trans "Show All Neighborhoods" %} +
+ {% endfor %}
- {% endfor %}
-
-{% endblock %} +
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/checkout.html b/core/templates/core/checkout.html index eb6fe49..72706ad 100644 --- a/core/templates/core/checkout.html +++ b/core/templates/core/checkout.html @@ -1,73 +1,130 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{% trans "Checkout" %}{% endblock %} +{% block title %}{% trans "Checkout" %} | Jimma Market{% endblock %} {% block content %} -
-

{% trans "Checkout" %}

- -
- {% csrf_token %} +
+
-
-

{% trans "Shipping Address" %}

-
-
- - -
+ +
+
+

{% trans "Delivery Information" %} 📍

+

{% trans "Complete your order by providing your delivery details. No registration required!" %}

-
- - -
+ + {% csrf_token %} + +
+
+ + +
+
+ + +
+
+ + +
+
-
- - -
+

{% trans "Where should we deliver?" %}

+
+
+ + +
+
+ + +
+
+ + +
+
-
- - -
+

{% trans "Payment Method" %}

+
+
+
+ + +

{% trans "Pay when you receive your items." %}

+
+
+
+
+ + +

{% trans "Coming soon!" %}

+
+
+
+ + {% if not user.is_authenticated %} +
+
+ + +

{% trans "This will create a free account for you to track your order." %}

+
+
+ {% endif %} + + +
- -
- -

{% trans "Payment Method" %}

- -
-
- - -
-
- - -
-
- - -
-
- -
-
-

- {% trans "Your cart" %} -

-
    -
  • - {% trans "Total (ETB)" %} - {{ total }} ETB -
  • -
+ +
+
+
{% trans "Order Summary" %}
+ +
+
+ {% trans "Subtotal" %} + {{ total }} ETB +
+
+ {% trans "Delivery Fee" %} + {% trans "FREE" %} +
+
+
+ {% trans "Total" %} + {{ total }} ETB +
+
+ +
+ + {% trans "By placing this order, you agree to Jimma Market's terms of service and delivery policies." %} +
+
- -
-{% endblock %} +
+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/contact_us.html b/core/templates/core/contact_us.html new file mode 100644 index 0000000..8edf164 --- /dev/null +++ b/core/templates/core/contact_us.html @@ -0,0 +1,109 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+
+ +
+

{% trans "Get in Touch" %}

+

+ {% trans "Have questions about an order or want to partner with us? Our team in Jimma is ready to help you." %} +

+ +
+
+
+ +
+
+
+
{% trans "Our Office" %}
+

{% trans "Jimma City Center, Near Hotel Central, Jimma, Ethiopia" %}

+
+
+ +
+
+
+ +
+
+
+
{% trans "Call Us" %}
+

+251 980 375 465

+
+
+ +
+
+
+ +
+
+
+
{% trans "Email Us" %}
+

bilalmaa614@gmail.com

+
+
+ +
+
{% trans "Developer Collaboration" %}
+

{% trans "Interested in the technical side or want to collaborate on the platform's development?" %}

+
+

Bilal

+

bilalmaa614@gmail.com

+

+251 980 375 465

+

@Bilnett

+

Osman-1234

+
+
+ +
+ + + + +
+
+ + +
+
+

{% trans "Send us a Message" %}

+
+ {% csrf_token %} +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/delivery_info.html b/core/templates/core/delivery_info.html new file mode 100644 index 0000000..4c59060 --- /dev/null +++ b/core/templates/core/delivery_info.html @@ -0,0 +1,115 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+
+
+

{% trans "Delivery Information" %}

+

+ {% trans "We provide fast and reliable delivery service across all Kebeles in Jimma city. Our mission is to get your products to you within hours of ordering." %} +

+
+
+ + +
+
+
+
+ +

{% trans "Jimma City Delivery Zones" %}

+

{% trans "We cover Central, North, South, and Outskirts zones." %}

+
+ Zone A (Central) + Zone B (Inner city) + Zone C (Outskirts) +
+
+ +
+
+
+
+ +
+ +
+

{% trans "Delivery Fees by Zone" %}

+
+
    +
  • +
    +
    {% trans "Zone A" %}
    + {% trans "Bosa, Mendera, Ginjo, Hermata" %} +
    + 50 ETB +
  • +
  • +
    +
    {% trans "Zone B" %}
    + {% trans "Kito Furdisa, Awetu, Ifa Bula" %} +
    + 75 ETB +
  • +
  • +
    +
    {% trans "Zone C" %}
    + {% trans "Bore, Hulle, Jimma University Outskirts" %} +
    + 100 ETB +
  • +
+
+

+ * {% trans "Fees may vary slightly based on package weight and volume." %} +

+
+ + +
+

{% trans "Available Delivery Slots" %}

+
+
+
+
09:00 - 12:00
+
{% trans "Morning Slot" %}
+
+
+
+
+
12:00 - 15:00
+
{% trans "Afternoon Slot 1" %}
+
+
+
+
+
15:00 - 18:00
+
{% trans "Afternoon Slot 2" %}
+
+
+
+
+
18:00 - 20:00
+
{% trans "Evening Slot" %}
+
+
+
+
+
{% trans "Express Delivery" %}
+

+ {% trans "Need it even faster? Choose 'Express' at checkout for delivery within 60 minutes for central Jimma locations (+30 ETB)." %} +

+
+
+
+ + +
+

{% trans "Track Your Order" %}

+

{% trans "Check the real-time status of your package using your order number and phone number." %}

+ {% trans "Track Now" %} +
+
+{% endblock %} diff --git a/core/templates/core/how_it_works.html b/core/templates/core/how_it_works.html new file mode 100644 index 0000000..b273d33 --- /dev/null +++ b/core/templates/core/how_it_works.html @@ -0,0 +1,103 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+
+

{% trans "How It Works" %}

+

{% trans "Shopping at Jimma Market is simple, fast, and secure." %}

+
+ + +
+
+
+
+
1
+
+
+

{% trans "Browse & Select" %}

+

{% trans "Explore thousands of products from local Jimma vendors. Use our smart search or category filters to find exactly what you need. No account required to start shopping!" %}

+
+
+
+
+
2
+
+
+

{% trans "Add to Cart" %}

+

{% trans "Found something you like? Click 'Add to Cart'. You can continue shopping for more items from different vendors and manage everything in one single cart." %}

+
+
+
+
+
3
+
+
+

{% trans "Guest Checkout" %}

+

{% trans "Go to your cart and click 'Proceed to Checkout'. Simply provide your phone number, delivery address in Jimma, and choose a delivery time slot that works for you." %}

+
+
+
+
+
+ Shopping Step +
+
+
+ +
+
+
+
+
4
+
+
+

{% trans "Fast Delivery" %}

+

{% trans "Our dedicated delivery team will pick up your items from the vendors and bring them directly to your door during your selected time slot." %}

+
+
+
+
+
5
+
+
+

{% trans "Pay & Enjoy" %}

+

{% trans "Pay securely using Telebirr, CBE Birr, or Cash on Delivery. Receive your items, check the quality, and enjoy your purchase!" %}

+
+
+
+
+
+ Delivery Step +
+
+
+ + +
+
+

{% trans "Payment Methods" %}

+
    +
  • Telebirr
  • +
  • CBE Birr
  • +
  • Cash on Delivery
  • +
  • Bank Transfer (CBE, Awash, etc.)
  • +
+
+
+

{% trans "Return Policy" %}

+

+ {% trans "If a product is damaged or doesn't match the description, you can return it within 24 hours of delivery. Contact our support team immediately for assistance." %} +

+
+
+

{% trans "Privacy & Security" %}

+

+ {% trans "Your personal data and transaction history are protected using industry-standard encryption. We never share your phone number with third parties." %} +

+
+
+
+{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index 50f3099..d29ff84 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,17 +1,61 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{% trans "Ethio-Marketplace | Home" %}{% endblock %} - {% block content %} -
+
-

{% trans "Welcome to Ethio-Marketplace" %}

-

{% trans "Discover amazing products from local vendors across Ethiopia." %}

-
- {% trans "Shop Now" %} - {% trans "Become a Seller" %} +
+
+ {% trans "Jimma's #1 Marketplace" %} +

+ {% trans "Shop Local," %}
+ {% trans "Live Better." %} +

+

+ {% trans "Discover fresh produce, electronics, and daily essentials from trusted Jimma vendors. Find sellers in your neighborhood!" %} +

+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+ +
+ Jimma Market +
+
+
@@ -19,80 +63,193 @@
-
-

{% trans "Shop by Category" %}

- {% trans "View All" %} +
+
+

{% trans "Browse Categories" %}

+

{% trans "Find exactly what you need" %}

+
+ + {% trans "View All" %} +
- -
+ +
-
-

{% trans "Featured Products" %}

- {% trans "View All" %} +
+
+

{% trans "Featured Products" %}

+

{% trans "Handpicked for you by our team" %}

+
+ {% trans "Shop All" %}
{% for product in featured_products %}
-
+
{% if product.image %} - {{ product.name }} + {{ product.name }} {% else %} -
- {% trans "No Image" %} +
+
{% endif %} -
-

{{ product.category.name }}

-
+
+
+ {{ product.category.name }} + {% if product.review_count > 0 %} +
+ {{ product.average_rating }} +
+ {% endif %} +
+
{{ product.name }}
-

{{ product.price }} ETB

- - {% trans "Add to Cart" %} - +
+ {{ product.price }} ETB + + + +
+
+
+
+ {% endfor %} +
+
+
+ + +
+
+
+
+

{% trans "Top Jimma Vendors" %}

+

{% trans "The people bringing Jimma's best to your door" %}

+
+ +
+
+ {% for vendor in local_vendors %} +
+
+
+ {{ vendor.business_name|slice:":1" }} +
+
{{ vendor.business_name }}
+
+ + + + + +
+

{{ vendor.description|default:"Jimma's trusted local seller providing quality products."|truncatewords:10 }}

+
+ + {{ vendor.kebele|default:vendor.address }} + +
+ {% trans "Verified Seller" %} +
{% empty %}
-

{% trans "No featured products available." %}

+ +

{% trans "No vendors found in this neighborhood yet." %}

+ {% trans "Show all vendors" %}
{% endfor %}
+ +{% if latest_articles %} +
+
+
+
+

{% trans "Market News & Stories" %}

+

{% trans "Stay updated with Jimma's local market" %}

+
+ + {% trans "Read All Stories" %} + +
+
+ {% for article in latest_articles %} +
+
+ {% if article.image %} + {{ article.title }} + {% else %} +
+ +
+ {% endif %} +
+ {{ article.created_at|date:"M d, Y" }} +
+ + {{ article.title }} + +
+

+ {{ article.content|striptags|truncatewords:15 }} +

+
+
+
+ {% endfor %} +
+
+
+{% endif %} + {% endblock %} diff --git a/core/templates/core/order_success.html b/core/templates/core/order_success.html index 905cd0a..dd97021 100644 --- a/core/templates/core/order_success.html +++ b/core/templates/core/order_success.html @@ -1,31 +1,54 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{% trans "Order Successful" %}{% endblock %} +{% block title %}{% trans "Order Successful" %} | Jimma Market{% endblock %} {% block content %} -
-
- -
-

{% trans "Thank you for your order!" %}

-

{% trans "Your order ID is" %} #{{ order.id }}. {% trans "We have received your request and will contact you shortly for delivery." %}

- -
-
-
-
{% trans "Order Details" %}
-

{% trans "Name" %}: {{ order.full_name }}

-

{% trans "Phone" %}: {{ order.phone }}

-

{% trans "Address" %}: {{ order.address }}

-

{% trans "Total" %}: {{ order.total_price }} ETB

-

{% trans "Payment" %}: {{ order.get_payment_method_display }}

+
+
+
+
+
+
+ +
+

{% trans "Order Placed Successfully!" %}

+

+ {% trans "Thank you for shopping with us, " %} {{ order.full_name }}! + {% trans "Your order" %} #{{ order.id }} {% trans "has been received and is being processed." %} +

+ +
+
{% trans "Delivery Details" %}
+
+ + {{ order.address }}, {{ order.get_kebele_display }} +
+
+ + {{ order.get_delivery_time_slot_display }} +
+
+ + {{ order.phone }} +
+
+ +

+ {% trans "A delivery agent will contact you shortly to confirm your location in Jimma. Please have your phone ready!" %} 📱 +

+ + +
- - -
-{% endblock %} +
+{% endblock %} \ No newline at end of file diff --git a/core/templates/core/product_detail.html b/core/templates/core/product_detail.html index 8e99307..6f2bade 100644 --- a/core/templates/core/product_detail.html +++ b/core/templates/core/product_detail.html @@ -1,49 +1,280 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{{ product.name }}{% endblock %} +{% block title %}{{ product.name }} | Jimma Market{% endblock %} {% block content %} -
- +
+
+ -
-
- {% if product.image %} - {{ product.name }} - {% else %} -
- {% trans "No Image Available" %} +
+ +
+
+ +
+ + +
+ {% if product.image %} +
+ Main +
+ {% endif %} + {% for img in product.images.all %} +
+ Thumb +
+ {% endfor %}
- {% endif %} -
-
-

{{ product.name }}

-

{{ product.category.name }}

-

{{ product.price }} ETB

- -
-
{% trans "Description" %}
-

{{ product.description }}

-
-
{% trans "Sold by" %}: {{ product.vendor.business_name }}
-

{% trans "Located in" %}: {{ product.vendor.address }}

-
+ +
+
+ {{ product.category.name }} +

{{ product.name }}

+ +
+
+ {% with ''|center:5 as range %} + {% for _ in range %} + {% if forloop.counter <= product.average_rating %} + + {% elif forloop.counter|add:"-0.5" <= product.average_rating %} + + {% else %} + + {% endif %} + {% endfor %} + {% endwith %} +
+ ({{ reviews.count }} {% trans "reviews" %}) + {% trans "In Stock" %} ({{ product.stock }}) +
-
- - {% trans "Add to Cart" %} - +
+ {{ product.price }} + ETB +
+ +
+
{% trans "Description" %}
+
+ {{ product.description|linebreaks }} +
+
+ + +
+ {% csrf_token %} +
+
+ + +
+
+ +
+
+
+ +
+
+
+ +
+
+ {% trans "Sold by" %} + {{ product.vendor.business_name }} +
+
+
+
+ +
+
+ {% trans "Delivery" %} + {% trans "Free in Jimma" %} +
+
+
+
-
+
+ + +
+
+
+
+

{% trans "Customer Reviews" %}

+ + {% for review in reviews %} +
+
+
+ {{ review.full_name|slice:":1" }} +
+
+
+
+
{{ review.full_name }}
+ {{ review.created_at|date }} +
+
+ {% with ''|center:5 as range %} + {% for _ in range %} + + {% endfor %} + {% endwith %} +
+

{{ review.comment }}

+
+
+ {% empty %} +
+ +

{% trans "No reviews yet. Be the first to review!" %}

+
+ {% endfor %} +
+ +
+
+
{% trans "Add a Review" %}
+

{% trans "Share your experience with this product to help other shoppers in Jimma." %}

+ +
+ {% csrf_token %} +
+ +
+ + + + + + +
+
+ {% if not user.is_authenticated %} +
+ + +
+ {% endif %} +
+ + +
+ +
+
+
+
+
+
+ + +
+
+

{% trans "You Might Also Like" %}

+
+ {% for rel in related_products %} +
+
+ {% if rel.image %} + {{ rel.name }} + {% else %} +
+ +
+ {% endif %} +
+
+ {{ rel.name }} +
+
+ {{ rel.average_rating }} +
+ {{ rel.price }} ETB +
+
+
+ {% endfor %} +
+
+
+ + + + {% endblock %} diff --git a/core/templates/core/product_list.html b/core/templates/core/product_list.html index 2b5ce48..accf258 100644 --- a/core/templates/core/product_list.html +++ b/core/templates/core/product_list.html @@ -1,52 +1,155 @@ {% extends "base.html" %} {% load i18n static %} -{% block title %}{% trans "All Products" %}{% endblock %} +{% block title %}{% trans "Shop All Products" %} | Jimma Market{% endblock %} {% block content %} -
-
-
-

{% trans "Our Products" %}

-
-
-
- - -
-
-
- -
- {% for product in products %} -
-
- {% if product.image %} - {{ product.name }} - {% else %} -
- {% trans "No Image" %} +
+
+
+
+

{% trans "Explore Our Shop" %} 🏬

+

{% trans "Discover the best products from Jimma's finest vendors." %}

+
+
+
+ {% if current_category %} + + {% endif %} + {% if current_kebele %} + + {% endif %} +
+ +
+ +
+
+
+ +
+ +
+
+
{% trans "Filters" %}
+ +
+ {% if request.GET.q %} + + {% endif %} + +
+ + +
+ +
+ +
+ + {% trans "All Categories" %} + + {% for cat in categories %} + + {{ cat.name }} + + {% endfor %} +
+
+ +
+ + +
+ +
+ +
+
+
+
+ + +
+ {% if current_kebele %} +
+ +
+ {% trans "Showing products from vendors in" %} {{ current_kebele }} +
+ +
{% endif %} -
-

{{ product.category.name }}

-
- - {{ product.name }} - -
-

{{ product.price }} ETB

- - {% trans "Add to Cart" %} - + +
+ {% for product in products %} +
+
+ {% if product.image %} + {{ product.name }} + {% else %} +
+ +
+ {% endif %} +
+
+ {{ product.category.name }} + {% if product.review_count > 0 %} +
+ {{ product.average_rating }} +
+ {% endif %} +
+
+ + {{ product.name }} + +
+
+ {{ product.vendor.business_name }} +
+ {{ product.vendor.kebele }} +
+
+ {{ product.price }} ETB + + + +
+
+
+
+ {% empty %} +
+ +

{% trans "No products found" %}

+

{% trans "Try adjusting your filters or search query." %}

+ {% trans "Clear Filters" %} +
+ {% endfor %}
- {% empty %} -
-

{% trans "No products found matching your search." %}

-
- {% endfor %}
-
+
+ + {% endblock %} diff --git a/core/templates/core/seller_info.html b/core/templates/core/seller_info.html new file mode 100644 index 0000000..696e6de --- /dev/null +++ b/core/templates/core/seller_info.html @@ -0,0 +1,153 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+
+
+
+

{% trans "Grow Your Business in Jimma" %}

+

+ {% trans "Join Jimma Market and start selling your products to thousands of customers across the city today." %} +

+ +
+
+ Seller Success +
+
+
+
+ +
+ +
+
+
+
500+
+
{% trans "Active Sellers" %}
+
+
+
+
+
10,000+
+
{% trans "Customers" %}
+
+
+
+
+
24/7
+
{% trans "Support" %}
+
+
+
+ + +

{% trans "Why Sell on Jimma Market?" %}

+
+
+
+
+ +
+

{% trans "Increase Sales" %}

+

{% trans "Reach customers outside your immediate neighborhood. Your shop will be open 24/7 to everyone in Jimma." %}

+
+
+
+
+
+ +
+

{% trans "Hassle-Free Logistics" %}

+

{% trans "Focus on your products; we handle the delivery. Our riders pick up from your shop and deliver to the customer." %}

+
+
+
+
+
+ +
+

{% trans "Free Marketing" %}

+

{% trans "We promote your products on social media and our app, giving your brand the visibility it deserves in Jimma." %}

+
+
+
+ + +
+
+

{% trans "Become a Seller in 3 Simple Steps" %}

+
+
+
+
1
+
+
+
{% trans "Sign Up" %}
+

{% trans "Create a seller account with your business details and contact information." %}

+
+
+
+
+
2
+
+
+
{% trans "Upload Products" %}
+

{% trans "Add photos and descriptions of your products. Our team will verify and approve them quickly." %}

+
+
+
+
+
3
+
+
+
{% trans "Start Earning" %}
+

{% trans "Receive orders, package the items, and hand them over to our rider. We transfer your earnings weekly." %}

+
+
+
+ +
+
+
+

{% trans "Simple Commission Structure" %}

+ + + + + + + + + + + + + + + +
+
{% trans "Registration Fee" %}
+

{% trans "Start for free" %}

+
{% trans "0 ETB" %}
+
{% trans "Monthly Subscription" %}
+

{% trans "No fixed costs" %}

+
{% trans "0 ETB" %}
+
{% trans "Sales Commission" %}
+

{% trans "Only pay when you sell" %}

+
{% trans "5% - 15%" %}
+

+ * {% trans "Commission varies by category. Contact us for bulk or special category rates." %} +

+
+
+
+
+{% endblock %} diff --git a/core/templates/core/track_order.html b/core/templates/core/track_order.html new file mode 100644 index 0000000..3f41f9d --- /dev/null +++ b/core/templates/core/track_order.html @@ -0,0 +1,91 @@ +{% extends 'base.html' %} +{% load i18n %} +{% load static %} + +{% block content %} +
+
+
+
+

{% trans "Track Your Order" %}

+

{% trans "Enter your order details below to see the current status of your delivery in Jimma." %}

+
+ +
+
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+
+ + {% if order %} +
+
+

{% trans "Order" %} #{{ order.id }}

+ + {% if order.status == 'pending' %}{% trans "Pending" %} + {% elif order.status == 'processing' %}{% trans "Processing" %} + {% elif order.status == 'shipped' %}{% trans "In Transit" %} + {% elif order.status == 'delivered' %}{% trans "Delivered" %} + {% else %}{{ order.status|capfirst }}{% endif %} + +
+ +
+
+
+
+ +
+ {% trans "Placed" %} +
+
+
+ +
+ {% trans "Packaged" %} +
+
+
+ +
+ {% trans "In Transit" %} +
+
+
+ +
+ {% trans "Delivered" %} +
+ +
+
+
+ +
+
{% trans "Delivery Details" %}
+

{% trans "Customer:" %} {{ order.full_name }}

+

{% trans "Kebele:" %} {{ order.get_kebele_display }}

+

{% trans "Address:" %} {{ order.address }}

+

{% trans "Time Slot:" %} {{ order.get_delivery_time_slot_display }}

+
+
+ {% endif %} +
+
+
+ + +{% endblock %} diff --git a/core/templates/core/vendor_dashboard.html b/core/templates/core/vendor_dashboard.html index 07c94cc..4695f6f 100644 --- a/core/templates/core/vendor_dashboard.html +++ b/core/templates/core/vendor_dashboard.html @@ -1,128 +1,242 @@ -{% extends "base.html" %} -{% load i18n static %} +{% extends 'base.html' %} +{% load static %} -{% block title %}{% trans "Vendor Dashboard" %}{% endblock %} +{% block title %}Vendor Dashboard - {{ vendor.business_name }}{% endblock %} {% block content %}
-
-
-

{{ vendor.business_name }}

-

{% trans "Manage your products and orders" %}

+
+
+

Welcome, {{ vendor.business_name }}

+

Manage your products and track your orders from one place.

+
+
- - {% trans "Add New Product" %} - -
-
- -
-
-
{% trans "Total Products" %}
-

{{ products.count }}

-
+ +
+
+
+
+
+ +
+
+

{{ products.count }}

+ Active Products +
+
+
+
+
+
+
+
+ +
+
+

{{ order_items.count }}

+ Total Sales +
+
+
+
+
+
+
+
+ +
+
+

{% if not vendor.is_verified %}Pending{% else %}Verified{% endif %}

+ Account Status +
+
+
+
+
+
+
+
+ +
+
+
{{ vendor.address }}
+ Business Location +
+
+
+
- -
-
-
{% trans "Total Orders" %}
-

{{ orders.count }}

-
-
- -
-
-
{% trans "Status" %}
- {% if vendor.is_verified %} - {% trans "Verified" %} - {% else %} - {% trans "Pending Verification" %} - {% endif %} -
-
-
-
-