Total Orders
+{{ total_orders }}
+diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc
index 5e8987a..8f6f021 100644
Binary files a/core/__pycache__/admin.cpython-311.pyc and b/core/__pycache__/admin.cpython-311.pyc differ
diff --git a/core/__pycache__/context_processors.cpython-311.pyc b/core/__pycache__/context_processors.cpython-311.pyc
index 75bf223..2f0013b 100644
Binary files a/core/__pycache__/context_processors.cpython-311.pyc and b/core/__pycache__/context_processors.cpython-311.pyc differ
diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc
index a251b5f..aa04515 100644
Binary files a/core/__pycache__/models.cpython-311.pyc and b/core/__pycache__/models.cpython-311.pyc differ
diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc
index f705988..c0a7488 100644
Binary files a/core/__pycache__/urls.cpython-311.pyc and b/core/__pycache__/urls.cpython-311.pyc differ
diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc
index 2f0989c..795ffaf 100644
Binary files a/core/__pycache__/views.cpython-311.pyc and b/core/__pycache__/views.cpython-311.pyc differ
diff --git a/core/admin.py b/core/admin.py
index 8c38f3f..bfae149 100644
--- a/core/admin.py
+++ b/core/admin.py
@@ -1,3 +1,8 @@
from django.contrib import admin
+from .models import UserProfile, Category, Product, Order, OrderItem
-# Register your models here.
+admin.site.register(UserProfile)
+admin.site.register(Category)
+admin.site.register(Product)
+admin.site.register(Order)
+admin.site.register(OrderItem)
\ No newline at end of file
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
new file mode 100644
index 0000000..6221d50
--- /dev/null
+++ b/core/migrations/0001_initial.py
@@ -0,0 +1,67 @@
+# Generated by Django 5.2.7 on 2026-03-13 07:23
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Category',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100)),
+ ('slug', models.SlugField(unique=True)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Order',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('status', models.CharField(choices=[('pending', 'Pending'), ('shipped', 'Shipped'), ('delivered', 'Delivered')], default='pending', max_length=20)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('buyer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Product',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=200)),
+ ('description', models.TextField()),
+ ('price', models.DecimalField(decimal_places=2, max_digits=10)),
+ ('stock', models.IntegerField(default=0)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='products', to='core.category')),
+ ('seller', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='products', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='OrderItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('quantity', models.IntegerField()),
+ ('price', models.DecimalField(decimal_places=2, max_digits=10)),
+ ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='core.order')),
+ ('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.product')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='UserProfile',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('is_seller', models.BooleanField(default=False)),
+ ('phone_number', models.CharField(blank=True, max_length=20)),
+ ('address', models.TextField(blank=True)),
+ ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/core/migrations/__pycache__/0001_initial.cpython-311.pyc b/core/migrations/__pycache__/0001_initial.cpython-311.pyc
new file mode 100644
index 0000000..bb0650e
Binary files /dev/null and b/core/migrations/__pycache__/0001_initial.cpython-311.pyc differ
diff --git a/core/models.py b/core/models.py
index 71a8362..67804bc 100644
--- a/core/models.py
+++ b/core/models.py
@@ -1,3 +1,47 @@
from django.db import models
+from django.contrib.auth.models import User
-# Create your models here.
+class UserProfile(models.Model):
+ user = models.OneToOneField(User, on_delete=models.CASCADE)
+ is_seller = models.BooleanField(default=False)
+ phone_number = models.CharField(max_length=20, blank=True)
+ address = models.TextField(blank=True)
+
+ def __str__(self):
+ return self.user.username
+
+class Category(models.Model):
+ name = models.CharField(max_length=100)
+ slug = models.SlugField(unique=True)
+
+ def __str__(self):
+ return self.name
+
+class Product(models.Model):
+ seller = models.ForeignKey(User, on_delete=models.CASCADE, related_name='products')
+ category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='products')
+ name = models.CharField(max_length=200)
+ description = models.TextField()
+ price = models.DecimalField(max_digits=10, decimal_places=2)
+ stock = models.IntegerField(default=0)
+ created_at = models.DateTimeField(auto_now_add=True)
+
+ def __str__(self):
+ return self.name
+
+class Order(models.Model):
+ buyer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
+ status = models.CharField(max_length=20, choices=[('pending', 'Pending'), ('shipped', 'Shipped'), ('delivered', 'Delivered')], default='pending')
+ created_at = models.DateTimeField(auto_now_add=True)
+
+ def __str__(self):
+ return f"Order {self.id} by {self.buyer.username}"
+
+class OrderItem(models.Model):
+ order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items')
+ product = models.ForeignKey(Product, on_delete=models.CASCADE)
+ quantity = models.IntegerField()
+ price = models.DecimalField(max_digits=10, decimal_places=2)
+
+ def __str__(self):
+ return f"{self.quantity} x {self.product.name} in Order {self.order.id}"
\ No newline at end of file
diff --git a/core/templates/core/buyer_dashboard.html b/core/templates/core/buyer_dashboard.html
new file mode 100644
index 0000000..4d3cd16
--- /dev/null
+++ b/core/templates/core/buyer_dashboard.html
@@ -0,0 +1,38 @@
+{% extends "core/dashboard_base.html" %}
+
+{% block title %}Buyer Dashboard | Ethio-gebeya{% endblock %}
+
+{% block dashboard_content %}
+ Total Orders {{ total_orders }} No orders yet.Recent Orders
+ {% if recent_orders %}
+
+
+
+ {% else %}
+
+
+
+
+ {% for order in recent_orders %}
+ Order
+ Status
+ Date
+
+
+ {% endfor %}
+
+ #{{ order.id }}
+ {{ order.get_status_display }}
+ {{ order.created_at|date:"Y-m-d" }}
+
A modern marketplace foundation with separate dashboards for buyers and sellers.
+ -AppWizzy AI is collecting your requirements and applying the first changes.
-This page will refresh automatically as the plan is implemented.
-
- Runtime: Django {{ django_version }} · Python {{ python_version }}
- — UTC {{ current_time|date:"Y-m-d H:i:s" }}
-
Runtime: Django {{ django_version }} · Python {{ python_version }} · {{ current_time|date:"Y-m-d H:i:s" }} UTC
+ - -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..eaeab59 --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,67 @@ +{% extends "base.html" %} + +{% block title %}Sign In | Ethio-gebeya{% endblock %} + +{% block head %} + +{% endblock %} + +{% block content %} +Products
+{{ product_count }}
+Orders
+{{ total_orders }}
+Revenue
+${{ total_revenue }}
+| Buyer | +Product | +Qty | +Total | +
|---|---|---|---|
| {{ sale.order.buyer.username }} | +{{ sale.product.name }} | +{{ sale.quantity }} | +${{ sale.price }} | +
No sales yet.
+ {% endif %} +