Skip to content

Commit

Permalink
chore: ✨ add advertisements app
Browse files Browse the repository at this point in the history
implement advertisement, advertisement image, attribute, adv attribute value models
  • Loading branch information
khodealib committed Oct 2, 2024
1 parent 1a5fe61 commit db2c757
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 6 deletions.
4 changes: 1 addition & 3 deletions accounts/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,7 @@ def save(self, commit=True):
class UserChangeForm(forms.ModelForm):
first_name = forms.CharField(max_length=255, required=False, label="First Name")
last_name = forms.CharField(max_length=255, required=False, label="Last Name")
password = ReadOnlyPasswordHashField(
help_text='you can change password using <a href="../password/">this form</a>'
)
password = ReadOnlyPasswordHashField(help_text='you can change password using <a href="../password/">this form</a>')

class Meta:
model = User
Expand Down
4 changes: 1 addition & 3 deletions accounts/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,7 @@ def create(self, validated_data):
try:
user = User.objects.create_user(**validated_data)
except ValidationError as e:
raise serializers.ValidationError(
detail=e.messages, code=status.HTTP_400_BAD_REQUEST
)
raise serializers.ValidationError(detail=e.messages, code=status.HTTP_400_BAD_REQUEST)
return user


Expand Down
Empty file added advertisements/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions advertisements/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
6 changes: 6 additions & 0 deletions advertisements/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AdvertisementsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "advertisements"
Empty file.
116 changes: 116 additions & 0 deletions advertisements/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
from django.contrib.auth import get_user_model
from django.core.validators import FileExtensionValidator
from django.db import models
from django.utils.translation import gettext_lazy as _

from categories.models import Category
from locations.models import Location
from utilities.base_model import BaseModel
from utilities.username import generate_random_string

# To get user from settings
User = get_user_model()


class Advertisement(BaseModel):
"""
This class represents Advertisement model.
Each user can one or more advertisement to publish 📢
"""

user = models.ForeignKey(
User,
on_delete=models.CASCADE,
verbose_name=_("user"),
related_name="advertisements",
)
title = models.CharField(max_length=50, verbose_name=_("title"))
description = models.TextField(blank=True, verbose_name=_("description"))
price = models.PositiveIntegerField(default=0, verbose_name=_("description"))
location = models.ForeignKey(
Location,
on_delete=models.CASCADE,
related_name="advertisements",
verbose_name=_("location"),
)
category = models.ForeignKey(
Category,
on_delete=models.CASCADE,
related_name="advertisements",
verbose_name=_("category"),
)

def __str__(self):
return f"{self.title} > {self.location.city.name}"

class Meta:
verbose_name = _("advertisement")
verbose_name_plural = _("advertisements")

@classmethod
def add(cls, user, title, description, price, location, category, images):
"""
Get data an Advertisement and Save it in Database 💾
"""
adv = cls.objects.create(
user=user,
title=title,
description=description,
price=price,
location=location,
category=category,
)
for file in images:
adv.images.create(name=generate_random_string(), image_file=file)
adv.save()

def get_absolute_url(self):
from django.urls import reverse

return reverse("advertisement-detail", args=[str(self.pk)])

@classmethod
def is_belong_user(cls, user, advertisement_pk):
"""To check this advertisement posted by this user or not"""
advertisement = cls.objects.select_related("user").get(pk=advertisement_pk)
return user == advertisement.user


class AdvertisementImage(BaseModel):
"""
This class represents Image model.
Each advertisement has one or many images. 🖼
"""

name = models.CharField(max_length=50, verbose_name=_("name"))
advertisement = models.ForeignKey(
Advertisement,
on_delete=models.CASCADE,
related_name="images",
verbose_name=_("advertisement"),
)
image_file = models.FileField(
upload_to="images/advertisement/",
validators=[FileExtensionValidator(allowed_extensions=("jpg", "png", "jpeg"))],
verbose_name=_("images"),
)


class Attribute(models.Model):
name = models.CharField(max_length=50, verbose_name=_("attribute"))


class AdvAttrValue(models.Model):
advertisement = models.ForeignKey(
Advertisement,
on_delete=models.CASCADE,
related_name="attributes",
verbose_name=_("advertisement"),
)
attribute = models.ForeignKey(
Attribute,
on_delete=models.CASCADE,
related_name="attributes",
verbose_name=_("attribute"),
)
value = models.CharField(max_length=50, verbose_name=_("value"))
3 changes: 3 additions & 0 deletions advertisements/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
3 changes: 3 additions & 0 deletions advertisements/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.shortcuts import render

# Create your views here.
2 changes: 2 additions & 0 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
# Local apps
"accounts.apps.AccountsConfig",
"categories.apps.CategoriesConfig",
"locations.apps.LocationsConfig",
"advertisements.apps.AdvertisementsConfig",
]

AUTH_USER_MODEL = "accounts.User"
Expand Down

0 comments on commit db2c757

Please sign in to comment.