Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
**/__pycache__
*.pyc
venv
env
.idea
backup.sqlite3
oc-lettings-site_old.sqlite3
flake8-report
Empty file added lettings/__init__.py
Empty file.
10 changes: 10 additions & 0 deletions lettings/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"""
Admin registration module for lettings app
"""
from django.contrib import admin

from lettings.models import Address, Letting


admin.site.register(Letting)
admin.site.register(Address)
13 changes: 13 additions & 0 deletions lettings/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
Namespace module for lettings app
"""
from django.apps import AppConfig


class LettingsConfig(AppConfig):
"""
Namespace class for Lettings
Attributes:
name: namespace of the lettings app
"""
name = 'lettings'
36 changes: 36 additions & 0 deletions lettings/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 3.0 on 2026-05-18 12:53

import django.core.validators
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

initial = True

dependencies = [
]

operations = [
migrations.CreateModel(
name='Address',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('number', models.PositiveIntegerField(validators=[django.core.validators.MaxValueValidator(9999)])),
('street', models.CharField(max_length=64)),
('city', models.CharField(max_length=64)),
('state', models.CharField(max_length=2, validators=[django.core.validators.MinLengthValidator(2)])),
('zip_code', models.PositiveIntegerField(validators=[django.core.validators.MaxValueValidator(99999)])),
('country_iso_code', models.CharField(max_length=3, validators=[django.core.validators.MinLengthValidator(3)])),
],
),
migrations.CreateModel(
name='Letting',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=256)),
('address', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='new_letting', to='lettings.Address')),
],
),
]
48 changes: 48 additions & 0 deletions lettings/migrations/0002_auto_20260518_1543.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Generated by Django 3.0 on 2026-05-18 13:43

from django.db import migrations


def copy_address(apps, schema_editor):
OldAddress = apps.get_model('oc_lettings_site', 'Address')
NewAddress = apps.get_model('lettings', 'Address')

for obj in OldAddress.objects.all():
NewAddress.objects.create(
id=obj.id,
number=obj.number,
street=obj.street,
city=obj.city,
state=obj.state,
zip_code=obj.zip_code,
country_iso_code=obj.country_iso_code,
)


def copy_lettings(apps, schema_editor):
OldLetting = apps.get_model('oc_lettings_site', 'Letting')
NewLetting = apps.get_model('lettings', 'Letting')
NewAddress = apps.get_model('lettings', 'Address')

for obj in OldLetting.objects.all():

new_address = NewAddress.objects.get(id=obj.address.id)

NewLetting.objects.create(
id=obj.id,
title=obj.title,
address=new_address,
)


class Migration(migrations.Migration):

dependencies = [
('lettings', '0001_initial'),
('oc_lettings_site', '0001_initial'),
]

operations = [
migrations.RunPython(copy_address),
migrations.RunPython(copy_lettings),
]
19 changes: 19 additions & 0 deletions lettings/migrations/0003_auto_20260518_1551.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 3.0 on 2026-05-18 13:51

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('lettings', '0002_auto_20260518_1543'),
]

operations = [
migrations.AlterField(
model_name='letting',
name='address',
field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='lettings.Address'),
),
]
Empty file added lettings/migrations/__init__.py
Empty file.
58 changes: 58 additions & 0 deletions lettings/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
Models module for lettings app
"""
from django.db import models
from django.core.validators import MaxValueValidator, MinLengthValidator


class Address(models.Model):
"""
Address model for Lettings
Attributes:
number (int): Letting number
street (str): Street address
city (str): City address
state (str): State address
zip_code (int): Zip code
country_iso_code (int): Country code
"""
number = models.PositiveIntegerField(validators=[MaxValueValidator(9999)])
street = models.CharField(max_length=64)
city = models.CharField(max_length=64)
state = models.CharField(max_length=2, validators=[MinLengthValidator(2)])
zip_code = models.PositiveIntegerField(validators=[MaxValueValidator(99999)])
country_iso_code = models.CharField(max_length=3, validators=[MinLengthValidator(3)])

class Meta:
"""
Meta class for Lettings to specify verbose names
"""
verbose_name = "Address"
verbose_name_plural = "Addresses"

def __str__(self) -> str:
"""
string method for Lettings
Returns:
A f-string with number and street address
"""
return f'{self.number} {self.street}'


class Letting(models.Model):
"""
Letting model for Lettings
Attributes:
title (str): Letting title
address (Address): Letting address
"""
title = models.CharField(max_length=256)
address = models.OneToOneField(Address, on_delete=models.CASCADE)

def __str__(self) -> str:
"""
String method for Lettings
Returns:
A f-string with letting title
"""
return self.title
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ <h1 class="page-header-ui-title mb-3 display-6">Lettings</h1>
<ul class="list-group list-group-flush list-group-careers">
{% for letting in lettings_list %}
<li class="list-group-item">
<a href="{% url 'letting' letting_id=letting.id %}">{{ letting.title }}</a>
<a href="{% url 'lettings:letting' letting_id=letting.id %}">{{ letting.title }}</a>
</li>
{% endfor %}
</ul>
Expand All @@ -36,7 +36,7 @@ <h1 class="page-header-ui-title mb-3 display-6">Lettings</h1>
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'index' %}">
Home
</a>
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'profiles_index' %}">
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'profiles:index' %}">
Profiles
</a>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,14 @@ <h1 class="page-header-ui-title mb-3 display-6">{{ title }}</h1>

<div class="container px-5 py-5 text-center">
<div class="justify-content-center">
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'lettings_index' %}">
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'lettings:index' %}">
<i class="ms-2" data-feather="arrow-right"></i>
Back
</a>
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'index' %}">
Home
</a>
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'profiles_index' %}">
<a class="btn fw-500 ms-lg-4 btn-primary px-10" href="{% url 'profiles:index' %}">
Profiles
</a>
</div>
Expand Down
6 changes: 6 additions & 0 deletions lettings/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
"""
Tests module for lettings app
"""
from django.test import TestCase

# Create your tests here.
13 changes: 13 additions & 0 deletions lettings/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"""
URLs module for lettings app
"""
from django.urls import path

from . import views

app_name = 'lettings'

urlpatterns = [
path('', views.index, name='index'),
path('<int:letting_id>/', views.letting, name='letting'),
]
67 changes: 67 additions & 0 deletions lettings/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
"""
Views module for lettings app
"""
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render

from .models import Letting


# Aenean leo magna, vestibulum et tincidunt fermentum, consectetur quis velit. Sed non placerat
# massa. Integer est nunc, pulvinar a tempor et, bibendum id arcu. Vestibulum ante ipsum primis in
# faucibus orci luctus et ultrices posuere cubilia curae; Cras eget scelerisque
def index(request: HttpRequest) -> HttpResponse:
"""
View function for lettings index page
Args:
request (HttpRequest): Http Request object

Returns:
An HTTP response with the list of lettings or an HTTP response with 500 error.
"""
try:
lettings_list = Letting.objects.all()
context = {'lettings_list': lettings_list}
return render(request, 'lettings/index.html', context)

except Exception as e:
context = {"error": str(e)}
return render(request, 'error_500.html', context=context)


# Cras ultricies dignissim purus, vitae hendrerit ex varius non. In accumsan porta nisl id
# eleifend. Praesent dignissim, odio eu consequat pretium, purus urna vulputate arcu, vitae
# efficitur lacus justo nec purus. Aenean finibus faucibus lectus at porta. Maecenas auctor, est ut
# luctus congue, dui enim mattis enim, ac condimentum velit libero in magna. Suspendisse potenti.
# In tempus a nisi sed laoreet. Suspendisse porta dui eget sem accumsan interdum. Ut quis urna
# pellentesque justo mattis ullamcorper ac non tellus. In tristique mauris eu velit fermentum,
# tempus pharetra est luctus. Vivamus consequat aliquam libero, eget bibendum lorem. Sed non dolor
# risus. Mauris condimentum auctor elementum. Donec quis nisi ligula. Integer vehicula tincidunt
# enim, ac lacinia augue pulvinar sit amet.
def letting(request: HttpRequest, letting_id: int) -> HttpResponse:
"""
View function for letting detail page
Args:
request (HttpRequest): Http Request object
letting_id (int): letting id

Returns:
An HTTP response with the letting detail or an HTTP response with 404 error if not found
or an HTTP response with 500 error
"""
try:
letting = Letting.objects.get(id=letting_id)

context = {
'title': letting.title,
'address': letting.address,
}
return render(request, 'lettings/letting.html', context=context)

except Letting.DoesNotExist:
context = {"type": "letting", "id": letting_id}
return render(request, 'error_404.html', context=context)

except Exception as e:
context = {"error": str(e)}
return render(request, 'error_500.html', context=context)
Binary file modified oc-lettings-site.sqlite3
Binary file not shown.
10 changes: 0 additions & 10 deletions oc_lettings_site/admin.py
Original file line number Diff line number Diff line change
@@ -1,10 +0,0 @@
from django.contrib import admin

from .models import Letting
from .models import Address
from .models import Profile


admin.site.register(Letting)
admin.site.register(Address)
admin.site.register(Profile)
8 changes: 8 additions & 0 deletions oc_lettings_site/apps.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
"""
App config module for oc_lettings_site app
"""
from django.apps import AppConfig


class OCLettingsSiteConfig(AppConfig):
"""
Namespace class for oc_lettings_site app
Attributes:
name (str): Name of the app
"""
name = 'oc_lettings_site'
30 changes: 30 additions & 0 deletions oc_lettings_site/migrations/0002_auto_20260518_1551.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Generated by Django 3.0 on 2026-05-18 13:51

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('oc_lettings_site', '0001_initial'),
]

operations = [
migrations.RemoveField(
model_name='letting',
name='address',
),
migrations.RemoveField(
model_name='profile',
name='user',
),
migrations.DeleteModel(
name='Address',
),
migrations.DeleteModel(
name='Letting',
),
migrations.DeleteModel(
name='Profile',
),
]
Loading