version 1
This commit is contained in:
parent
7563692b8b
commit
a6552f1692
Binary file not shown.
32
core/migrations/0002_seller_product_seller.py
Normal file
32
core/migrations/0002_seller_product_seller.py
Normal file
@ -0,0 +1,32 @@
|
||||
# Generated by Django 5.2.7 on 2026-03-13 00:39
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('core', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Seller',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('store_name', models.CharField(max_length=200)),
|
||||
('description', models.TextField(blank=True)),
|
||||
('is_verified', models.BooleanField(default=False)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='product',
|
||||
name='seller',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='products', to='core.seller'),
|
||||
),
|
||||
]
|
||||
Binary file not shown.
@ -1,6 +1,18 @@
|
||||
from django.db import models
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
class Seller(models.Model):
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
||||
store_name = models.CharField(max_length=200)
|
||||
description = models.TextField(blank=True)
|
||||
is_verified = models.BooleanField(default=False)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.store_name
|
||||
|
||||
class Product(models.Model):
|
||||
seller = models.ForeignKey(Seller, on_delete=models.CASCADE, related_name='products', null=True, blank=True)
|
||||
name = models.CharField(max_length=200)
|
||||
description = models.TextField()
|
||||
price = models.DecimalField(max_digits=10, decimal_places=2)
|
||||
|
||||
@ -1,25 +1,41 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{% block title %}Knowledge Base{% endblock %}</title>
|
||||
{% if project_description %}
|
||||
<meta name="description" content="{{ project_description }}">
|
||||
<meta property="og:description" content="{{ project_description }}">
|
||||
<meta property="twitter:description" content="{{ project_description }}">
|
||||
{% endif %}
|
||||
{% if project_image_url %}
|
||||
<meta property="og:image" content="{{ project_image_url }}">
|
||||
<meta property="twitter:image" content="{{ project_image_url }}">
|
||||
{% endif %}
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}Ethio-Gebeya{% endblock %}</title>
|
||||
{% load static %}
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="{% static 'css/custom.css' %}?v={{ deployment_timestamp }}">
|
||||
{% block head %}{% endblock %}
|
||||
</head>
|
||||
<body class="d-flex flex-column min-vh-100">
|
||||
|
||||
<body>
|
||||
{% block content %}{% endblock %}
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm py-3">
|
||||
<div class="container">
|
||||
<a class="navbar-brand fw-bold" href="/">ETHIO-GEBEYA</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav ms-auto">
|
||||
<li class="nav-item"><a class="nav-link" href="/">Shop</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="#">Account</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="flex-grow-1">
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<footer class="bg-dark text-white py-4 mt-auto">
|
||||
<div class="container text-center">
|
||||
<p class="mb-0">© 2026 Ethio-Gebeya. Professional Market Solutions.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
</html>
|
||||
@ -3,24 +3,31 @@
|
||||
{% block title %}Ethio-Gebeya | Modern Marketplace{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<header class="hero">
|
||||
<h1 class="display-3">Welcome to Ethio-Gebeya</h1>
|
||||
<p class="lead">Your premium destination for quality goods.</p>
|
||||
<div class="mt-4">
|
||||
<button class="btn btn-lg" style="background-color: var(--accent); color: white;">Start Shopping</button>
|
||||
<header class="hero text-white py-5">
|
||||
<div class="container text-center">
|
||||
<h1 class="display-3 mb-3">Welcome to Ethio-Gebeya</h1>
|
||||
<p class="lead mb-4">Discover the best quality goods in one place.</p>
|
||||
<a href="#products" class="btn btn-lg px-4" style="background-color: var(--accent); color: white;">Start Shopping</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="product-grid">
|
||||
{% for product in products %}
|
||||
<article class="product-card">
|
||||
<h3>{{ product.name }}</h3>
|
||||
<p>{{ product.description|truncatewords:15 }}</p>
|
||||
<p class="price" style="font-weight: 700; color: var(--primary);">ETB {{ product.price }}</p>
|
||||
<a href="#" style="text-decoration: none; color: var(--accent);">View Details →</a>
|
||||
</article>
|
||||
{% empty %}
|
||||
<p>No products available yet.</p>
|
||||
{% endfor %}
|
||||
</main>
|
||||
{% endblock %}
|
||||
<section id="products" class="container py-5">
|
||||
<h2 class="text-center mb-5 text-dark">Featured Products</h2>
|
||||
<div class="row row-cols-1 row-cols-md-3 g-4">
|
||||
{% for product in products %}
|
||||
<div class="col">
|
||||
<article class="product-card h-100 shadow-sm border-0">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ product.name }}</h5>
|
||||
<p class="card-text text-muted">{{ product.description|truncatewords:15 }}</p>
|
||||
<p class="h5 fw-bold text-primary">ETB {{ product.price }}</p>
|
||||
<a href="#" class="btn btn-outline-primary mt-3">View Details</a>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
{% empty %}
|
||||
<p class="text-center w-100">No products available yet.</p>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
@ -16,33 +16,44 @@ body {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, .brand {
|
||||
h1, h2, h3, .navbar-brand {
|
||||
font-family: 'Manrope', sans-serif;
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
.hero {
|
||||
background: linear-gradient(135deg, var(--secondary), var(--primary));
|
||||
color: white;
|
||||
padding: 80px 20px;
|
||||
padding: 100px 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.product-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||
gap: 2rem;
|
||||
padding: 40px 20px;
|
||||
border-bottom-left-radius: 40px;
|
||||
border-bottom-right-radius: 40px;
|
||||
}
|
||||
|
||||
.product-card {
|
||||
background: white;
|
||||
border-radius: 12px;
|
||||
border-radius: 16px;
|
||||
padding: 1.5rem;
|
||||
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.05);
|
||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.product-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 10px 15px -3px rgba(0,0,0,0.1);
|
||||
}
|
||||
transform: translateY(-8px);
|
||||
box-shadow: 0 20px 25px -5px rgba(0,0,0,0.1);
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-family: 'Manrope', sans-serif;
|
||||
font-size: 1.25rem;
|
||||
color: var(--secondary);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background-color: var(--accent);
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
padding: 0.6rem 1.5rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user