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.
7 changes: 7 additions & 0 deletions lettings/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.contrib import admin

from lettings.models import Address, Letting


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


class LettingsConfig(AppConfig):
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.
13 changes: 4 additions & 9 deletions oc_lettings_site/models.py → lettings/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from django.db import models
from django.core.validators import MaxValueValidator, MinLengthValidator
from django.contrib.auth.models import User


class Address(models.Model):
Expand All @@ -11,6 +10,10 @@ class Address(models.Model):
zip_code = models.PositiveIntegerField(validators=[MaxValueValidator(99999)])
country_iso_code = models.CharField(max_length=3, validators=[MinLengthValidator(3)])

class Meta:
verbose_name = "Address"
verbose_name_plural = "Addresses"

def __str__(self):
return f'{self.number} {self.street}'

Expand All @@ -21,11 +24,3 @@ class Letting(models.Model):

def __str__(self):
return self.title


class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
favorite_city = models.CharField(max_length=64, blank=True)

def __str__(self):
return self.user.username
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
3 changes: 3 additions & 0 deletions lettings/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.
10 changes: 10 additions & 0 deletions lettings/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
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'),
]
40 changes: 40 additions & 0 deletions lettings/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from django.shortcuts import render, get_object_or_404

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):
lettings_list = Letting.objects.all()
context = {'lettings_list': lettings_list}
return render(request, 'lettings/index.html', 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, letting_id):
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": 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)
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',
),
]
4 changes: 3 additions & 1 deletion oc_lettings_site/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

INSTALLED_APPS = [
'oc_lettings_site.apps.OCLettingsSiteConfig',
'lettings.apps.LettingsConfig',
'profiles.apps.ProfilesConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
Expand Down Expand Up @@ -111,4 +113,4 @@
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / "static",]
STATICFILES_DIRS = [BASE_DIR / "static", ]
8 changes: 3 additions & 5 deletions oc_lettings_site/urls.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
from django.contrib import admin
from django.urls import path
from django.urls import path, include

from . import views

urlpatterns = [
path('', views.index, name='index'),
path('lettings/', views.lettings_index, name='lettings_index'),
path('lettings/<int:letting_id>/', views.letting, name='letting'),
path('profiles/', views.profiles_index, name='profiles_index'),
path('profiles/<str:username>/', views.profile, name='profile'),
path('lettings/', include('lettings.urls')),
path('profiles/', include('profiles.urls')),
path('admin/', admin.site.urls),
]
46 changes: 6 additions & 40 deletions oc_lettings_site/views.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,11 @@
from django.shortcuts import render
from .models import Letting, Profile




# Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie quam lobortis leo consectetur ullamcorper non id est. Praesent dictum, nulla eget feugiat sagittis, sem mi convallis eros,
# vitae dapibus nisi lorem dapibus sem. Maecenas pharetra purus ipsum, eget consequat ipsum lobortis quis. Phasellus eleifend ex auctor venenatis tempus.
# Aliquam vitae erat ac orci placerat luctus. Nullam elementum urna nisi, pellentesque iaculis enim cursus in. Praesent volutpat porttitor magna, non finibus neque cursus id.
# Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque molestie quam lobortis leo
# consectetur ullamcorper non id est. Praesent dictum, nulla eget feugiat sagittis, sem mi
# convallis eros, vitae dapibus nisi lorem dapibus sem. Maecenas pharetra purus ipsum, eget
# consequat ipsum lobortis quis. Phasellus eleifend ex auctor venenatis tempus. Aliquam vitae erat
# ac orci placerat luctus. Nullam elementum urna nisi, pellentesque iaculis enim cursus in.
# Praesent volutpat porttitor magna, non finibus neque cursus id.
def index(request):
return render(request, 'index.html')

# 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 lettings_index(request):
lettings_list = Letting.objects.all()
context = {'lettings_list': lettings_list}
return render(request, 'lettings_index.html', 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, letting_id):
letting = Letting.objects.get(id=letting_id)
context = {
'title': letting.title,
'address': letting.address,
}
return render(request, 'letting.html', context)

# Sed placerat quam in pulvinar commodo. Nullam laoreet consectetur ex, sed consequat libero pulvinar eget. Fusc
# faucibus, urna quis auctor pharetra, massa dolor cursus neque, quis dictum lacus d
def profiles_index(request):
profiles_list = Profile.objects.all()
context = {'profiles_list': profiles_list}
return render(request, 'profiles_index.html', context)

# Aliquam sed metus eget nisi tincidunt ornare accumsan eget lac
# laoreet neque quis, pellentesque dui. Nullam facilisis pharetra vulputate. Sed tincidunt, dolor id facilisis fringilla, eros leo tristique lacus,
# it. Nam aliquam dignissim congue. Pellentesque habitant morbi tristique senectus et netus et males
def profile(request, username):
profile = Profile.objects.get(user__username=username)
context = {'profile': profile}
return render(request, 'profile.html', context)
Empty file added profiles/__init__.py
Empty file.
6 changes: 6 additions & 0 deletions profiles/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.contrib import admin

from profiles.models import Profile


admin.site.register(Profile)
5 changes: 5 additions & 0 deletions profiles/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class ProfilesConfig(AppConfig):
name = 'profiles'
Loading