From ec720dbd4beb9984424796e3fa79354097910b27 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Fri, 31 Oct 2025 16:35:03 +0000 Subject: [PATCH] version 2 --- core/__pycache__/forms.cpython-311.pyc | Bin 0 -> 1539 bytes core/__pycache__/models.cpython-311.pyc | Bin 1011 -> 1998 bytes core/__pycache__/urls.cpython-311.pyc | Bin 348 -> 1359 bytes core/__pycache__/views.cpython-311.pyc | Bin 642 -> 5399 bytes core/forms.py | 16 ++++ ...perty_image_url_property_image_and_more.py | 30 +++++++ core/migrations/0003_booking.py | 26 ++++++ ...rl_property_image_and_more.cpython-311.pyc | Bin 0 -> 1461 bytes .../__pycache__/0003_booking.cpython-311.pyc | Bin 0 -> 1575 bytes core/models.py | 15 +++- core/templates/base.html | 66 ++++++++++++++ core/templates/core/about.html | 10 +++ core/templates/core/booking_create.html | 12 +++ core/templates/core/contact.html | 9 ++ core/templates/core/faq.html | 16 ++++ core/templates/core/index.html | 2 +- core/templates/core/login.html | 22 +++++ core/templates/core/profile.html | 20 +++++ core/templates/core/property_create.html | 12 +++ core/templates/core/property_detail.html | 28 ++++++ core/templates/core/signup.html | 22 +++++ core/urls.py | 12 ++- core/views.py | 81 +++++++++++++++++- 23 files changed, 393 insertions(+), 6 deletions(-) create mode 100644 core/__pycache__/forms.cpython-311.pyc create mode 100644 core/forms.py create mode 100644 core/migrations/0002_remove_property_image_url_property_image_and_more.py create mode 100644 core/migrations/0003_booking.py create mode 100644 core/migrations/__pycache__/0002_remove_property_image_url_property_image_and_more.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0003_booking.cpython-311.pyc create mode 100644 core/templates/core/about.html create mode 100644 core/templates/core/booking_create.html create mode 100644 core/templates/core/contact.html create mode 100644 core/templates/core/faq.html create mode 100644 core/templates/core/login.html create mode 100644 core/templates/core/profile.html create mode 100644 core/templates/core/property_create.html create mode 100644 core/templates/core/property_detail.html create mode 100644 core/templates/core/signup.html diff --git a/core/__pycache__/forms.cpython-311.pyc b/core/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..905f5aadab1b614153860f0e4d4ec6d1cd6cec53 GIT binary patch literal 1539 zcmb7Dzfaph6u$GXI4KAMEksevhGOhNNVC;X;HAoE6O_e$!bqER*Q{S^mLm;i%v;FD$-t+gK?|tuce}9U=`gWkX zKPe$U@TI-<3!~+Mu|*hRv_#6(qLeU&sU@YXT54IdG)ffmlrZf*VLGSF?eEC0O2|Gu z@v@94%7CcEU!oGsd_i)_6Z|MgrT*F%<=_NrBRNHy&xK#%B3ze=Ip1G#y<#CIk5RjL zY25{5i*RC5Ml2=DOChhat3XBY#LH5d3b{1d*QT9^WL=Ey*jBcSk*k(gg!A}BEuAUA zp`NENb4)Jq&;epSbi)#tX2~x&q3e5cpd#D?x8Wab&n+&6Qg_QvkuT;9Y1+2ul(}uo zlx>%NRxP33XWMV8PAT>XJX)!Plb59N+T|q{?2#7!&H4TOl3(We>Z__3R`dKVFH}Qc z%W5&lh~b^U-NeR@SA46$)%Vat31n?|xs6!AwnWr043|LG0EV%x+_ctzt zbglJm8Ml^zwIe2MJ)=x1DweJgZY(FFv;a(HnoAG#T@dR&3N~8*62pug#WGm}gk+u% zUMeWkkxT{9s?cUm2vXu6i!Ci&uW+g1F3yP)h9bx*;tpgL*v`dV@@kt5^bH{lBj9Mt zccnQ$yWMgm?q%t)2F;!3Bs~O+3x$W_t{Nc#g zk@|y2_3Z3XcJ??s+sI68>pKHqRu5O}lhgIg%u#0MI5X4K)!|f=0MrtAUDBAyVA3m+ z!XXq0NqB-OfKDMz#n6H4I-KI(Sr12?4e1thrZm{H;}!k*P>g8Af@t0Zo|;T9;LxE+ zVqr(6beDH-PQ_z8EhgX-R6y_nps7+y8zfWjz8hq`-s^5^D#h98jT;X)XHFyE+2x2- Vg2K;VhmG;g{3-6A^>9W9@C!mUP=f#f literal 0 HcmV?d00001 diff --git a/core/__pycache__/models.cpython-311.pyc b/core/__pycache__/models.cpython-311.pyc index 0103a73fa049fff7b4f22b29800eec42393af348..68e407f25840bd9297733902d31a05545f219478 100644 GIT binary patch literal 1998 zcma)7%}*Og6rc46UfT-`gt`eeicx44x71eEs;VkPm11Z}RoW6a2OqLpJcC(S?>e*V zB%mC8$N{Mwa;QWkRH-LQge&FHKY(M7YiSSGUVGw3L{7Q1@9laaK)=R2zkM_F=DoLX zesBD1e}9TV`>h?*-i;FS2M)p(?+M4NAZ!y#sGyU&P!R-_BYLDBtwaS9Azu+1eN1SK z39GSi^DbE1haR*_+}DbOR^Pv9_0hy_k{1tgQ(o};>Lz8n1ybw>i}7mDnE&eQ4USz9 zwh1E@fs#rjLRj=P2o{G?s0rayp&i+U5cf~QtR(y$VrZI1+p%2%G@u8qlKfANl&_Hv zchETPYbSOiU5isb9`hhr-G(In5MX@I64lZs5!kOs*UzvE_uaeKX-k9tYdP#_!3 zW?sx_>be(S(p6*a@J}!a8A{dFhlVF6-^+nTMj zXK-v5)0ZvWk$YVzu9$UJY%VnoyIEupS+xm1iVsY_W;Gz3V%6lV7@T;avF;@l#j?4g zYz&53DD-A9(H7FSMY{5(tqn)Ka*P2iZTo-k-s@j@qcv2}yqrd3M z4X#z00_UU{T5ZMlQuCP1U@`6|mS@1gGs5477k>)@Iq3tswsrtoC%>*VwmIiYV^8Vc za@#og<&IQ#rE+VwD`jypyBBq&$&NJXN|P`tU){X#%2)S3cI0A5F1m8Db+env zKUsD&`RCss+;cMXoy@$OnQwg?T6eC0elYQ(>`03pY0;GyTeC+oAwGIUEhN! delta 614 zcmX@d|Cya{IWI340}v#yV#$nQoX98PX946*XGmd4Va#F3WsG8EWME=&XGmdcVMt+4 zWz1p%sRn^%%nS^xffxd!m{VAS88lg6g1DNDx7c#?Q&Mw^lP3y_)-M7IO=n1Dh+<4( zh+<-5NM+7qf#_lY+Omde86(gnAclY_R)Q+nz$(~bI#PgkuVGyVblGaS>!LWoYB+&v zjKS(s*izV2*w=8NIh!kmvxOmwJB17AcR8E8Bn+gA1VIEVi~xmj zaSf1YfWyffnVrN1iGRT&2{su3=?{CU diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 85d8d1a0a58e12ab95ac29a4d22671222d83d85d..17981d31cbb3d08325cb83b8659a116c6bef31ea 100644 GIT binary patch literal 1359 zcmd5)y>HV%6h9}=UvWN43;jw5x==-=y#aNgsw#w9F(A>32qAeOa&y3v) z9kY?KVt^v}V{FMoqb=Au0IZM+uE3fCR zf?g0%22p_k%@XmO^ojTS%D-gAh)iXoq#`N>l1oK2Dw2FEQlJtkrXnS(kf~JU4pqr? zDl$WJ;iBak>r$d>0QYX|k%y#(8(O}eYX;|EMoI}%Y z*2lKYGY-r)4Mk(0mkH&DW4lJf4YLQvyAUyPOvyGZ+AmMa<4x0cHzroyBwLuNJhCq* zG;t^;N?(ep;!uqLeK}#v@kHrQO^V=z5N6S}?BBn2|J^B?05dHLQ+Qa!9_}!0Oj-6q@+Byz+n)O1qU3Guda&oiUI2Ts_iSPC{JiA>_5lZg6W{z`av7r-85vTTQkZj? za+#x;CuYf*r!z*eq_77wXmY#+Y0+f7#Zr)1lJSxe!ePzKOG&M`#ZUw?5G0wGn49XS z$vXKTliXxKX5Sb-pg2fvu@{i|z|6?Vc!NRa0xEjIAaMZ|ePCl?A%1~H Y@gj@j6&A%0%uM`D4cs7D!~--A0KC&Qo&W#< diff --git a/core/__pycache__/views.cpython-311.pyc b/core/__pycache__/views.cpython-311.pyc index f0a068a6e3a8a586f0e5c8c2efb2892a455ffbb1..5eca40a98d987b94372593bbf5f4dfba851e4104 100644 GIT binary patch literal 5399 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 I3DeEL0QmbyiU0rr delta 276 zcmbQP)x^rToR^o20SJm$v1EQ=n8+vLr2^zlXGmd4Va#F3WsG8EWJqC3Va{R7WsYJ7 zvRPUfqF7Q`gBdj0UV=1gGTvedl-+GrN%M-ZbBnC-=3^ zX;OtM*SLMVtSFRM??sIA>eABE*Vqfa#B+Ua4Ouj#EZOF^7r1?jQ|8M~i0b3e4Jg+o z8dAOb%UrnuOF`UhXx!-fZnz1Csqb?;9r}?=a1u2%CbDHU0B&q})F<4CwnEApIukiE zksi0B5W`_KpQGusj)K?qCdakopwpD#kyjt}mj&n2GH9nRv?`4&5&32_4dq z(6G17#IW(%*4pY1cx|P9AK$*a+`h%DQwxvAeC9q4qQ~@_49aQ|A}J=Oo;%k?B?^^u z4Ql4~!<%%Qn`GdI{fMii%Pko(Oe(KjZLM5wEw{NN3Rz6=U+4fFp;un>rzoJ!w3~)W z+N4itFHIuW+=|#{Jal`sDLT^pf9jjin{P0aq2c3&7L7S6azg^;VRUi0&BXU6L5z0% z55Ug!%1va?PppOCoXlEyW@VSJytG=G)yfU+jJb0wuOj<%p*uJEcz$yFEQoDq9|0T+ z$Sq`_73$BV`jbih!qZDx{lc@0f3J?)56AWOm-Y3mzMfZfu?^r*K<>PM+w%u69%b#d zto>uw-WYGjhY0z~vYI3GL0jFI2qK_Q`uuRVZtmO=7rRs@+_3nkMQ0XCcd__wESBwI z=fRB69O-*exKWIUJ>4NENjAQy;g`a%biM%8E9={00Ka2j0W1C_aRQKQilRVWmH9C` kU)+XPG&YZ8{1** zY)Mah;J~pr_7?=u?tw!O72*eQbR-|5IU#ZCE!Fna6L0KwD6|q1W6$%O_dV~!Kj!lp z1ncox()=}n(4XQEuha!{{v{wkAcBb0M=c4ya$mL*t%M|KiGI>bwNjSSQY0j!PZ3Fe zhe(R1dg<8E7%ZQ{j#ev8q&-wqo{HmcP2#FcJ#uOrx1W>eIm9B6@G~Jlz6GNB-a@S2)8^RX94o{a$)4rLGI)a> zE%28Azt&#P&#QL3sk4QD`szxpB3Xp06}Yw&R|v|L>^O|_4^~%KuVY3n=ZN9~a|V=o zBWzkmm*OGo|C?mk1Y1HceZz4Mq3~Qb$=z)(-`uPvdCnMm4(>2&c$Dz$fPo!0!iRLk zHJ38e=$j8I&mB?Lc3g^W!=gOndIs|_0Tr%NFdt!YC=c@@%tm~KxHZSd&|4JbWzXTs zAy^jI39TsyChZeu9lZ0!=GJYVn@gC~<=Kt!sym|BnHV{qyJ2>lkc4d!2G=&> zRuP)nhHIEz`xfLvAw9$HI$S1gu7+2Enc?Y;=H5ngbBkw05u!Qz8J&xUdGWFSwPR6z z*dE&6P^aJ04)|dD1BV^D1EWKAktF@^`O~4Q@8fn+MJ~l%gXWXSq^Dc!FzjJeDjau8-A(&=qM=FpCo_3?67mXtltdQ?*!{DAKQM#nN*yh;`oKZv{>@X^^;3Mx&F)k0ehi-81>pmtN};y?{Yl=vxFo`kZI{%AH5U3 i(-?V)vf`uHyfbA + + {% block content %}{% endblock %} + +
+
+
+
+
Homey
+

+ Your home away from home. +

+
+
+
Links
+ +
+
+
+
+ © 2025 Copyright: + Homey.com +
+
+ diff --git a/core/templates/core/about.html b/core/templates/core/about.html new file mode 100644 index 0000000..9890afb --- /dev/null +++ b/core/templates/core/about.html @@ -0,0 +1,10 @@ +{% extends 'base.html' %} + +{% block content %} +
+

About Us

+

Welcome to Homey, your number one source for vacation rentals. We're dedicated to giving you the very best of properties, with a focus on dependability, customer service and uniqueness.

+

Founded in 2025, Homey has come a long way from its beginnings. We now serve customers all over the world, and are thrilled to be a part of the quirky, eco-friendly, fair trade wing of the tourism industry.

+

We hope you enjoy our properties as much as we enjoy offering them to you. If you have any questions or comments, please don't hesitate to contact us.

+
+{% endblock %} diff --git a/core/templates/core/booking_create.html b/core/templates/core/booking_create.html new file mode 100644 index 0000000..63c0ac7 --- /dev/null +++ b/core/templates/core/booking_create.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Book {{ property.title }}

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+{% endblock %} diff --git a/core/templates/core/contact.html b/core/templates/core/contact.html new file mode 100644 index 0000000..fbae91b --- /dev/null +++ b/core/templates/core/contact.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Contact Us

+

If you have any questions, please feel free to contact us.

+

Email: contact@homey.com

+
+{% endblock %} diff --git a/core/templates/core/faq.html b/core/templates/core/faq.html new file mode 100644 index 0000000..c9942c5 --- /dev/null +++ b/core/templates/core/faq.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Frequently Asked Questions

+ +

How do I book a property?

+

To book a property, simply click the "Book Now" button on the property's detail page and fill out the booking form.

+ +

Can I cancel a booking?

+

Currently, cancellation is not supported through the website. Please contact us directly to cancel a booking.

+ +

How do I list my own property?

+

After creating an account, you can click on the "Create Listing" link in the navigation bar to add your property.

+
+{% endblock %} diff --git a/core/templates/core/index.html b/core/templates/core/index.html index c86290d..7a14653 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -40,7 +40,7 @@
{{ property.title }}

{{ property.location }}

${{ property.price_per_night }} / night

- View Details + View Details diff --git a/core/templates/core/login.html b/core/templates/core/login.html new file mode 100644 index 0000000..38fc307 --- /dev/null +++ b/core/templates/core/login.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+
+
+

Login

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/profile.html b/core/templates/core/profile.html new file mode 100644 index 0000000..55d09af --- /dev/null +++ b/core/templates/core/profile.html @@ -0,0 +1,20 @@ +{% extends 'base.html' %} + +{% block content %} +
+

My Bookings

+ {% if bookings %} +
    + {% for booking in bookings %} +
  • + {{ booking.property.title }} +

    From: {{ booking.start_date }}

    +

    To: {{ booking.end_date }}

    +
  • + {% endfor %} +
+ {% else %} +

You have no bookings yet.

+ {% endif %} +
+{% endblock %} diff --git a/core/templates/core/property_create.html b/core/templates/core/property_create.html new file mode 100644 index 0000000..8c9a251 --- /dev/null +++ b/core/templates/core/property_create.html @@ -0,0 +1,12 @@ +{% extends 'base.html' %} + +{% block content %} +
+

Create a New Property Listing

+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+{% endblock %} diff --git a/core/templates/core/property_detail.html b/core/templates/core/property_detail.html new file mode 100644 index 0000000..cd13baa --- /dev/null +++ b/core/templates/core/property_detail.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% load static %} + +{% block content %} +
+
+
+
+ {{ property.title }} +
+

{{ property.title }}

+

{{ property.location }}

+

${{ property.price_per_night }} / night

+

{{ property.description }}

+
+
+
+
+
+
+
Book this property
+ Book Now +
+
+
+
+
+{% endblock %} diff --git a/core/templates/core/signup.html b/core/templates/core/signup.html new file mode 100644 index 0000000..dc87e80 --- /dev/null +++ b/core/templates/core/signup.html @@ -0,0 +1,22 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+
+
+
+

Sign Up

+
+
+
+ {% csrf_token %} + {{ form.as_p }} + +
+
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 8e0d0ae..1a1a32e 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,17 @@ from django.urls import path -from .views import index +from .views import index, signup_view, login_view, logout_view, property_detail, property_create, booking_create, profile, about, contact, faq urlpatterns = [ path("", index, name="index"), + path("property//", property_detail, name="property_detail"), + path("signup/", signup_view, name="signup"), + path("login/", login_view, name="login"), + path("logout/", logout_view, name="logout"), + path("property/create/", property_create, name="property_create"), + path("property//book/", booking_create, name="booking_create"), + path("profile/", profile, name="profile"), + path("about/", about, name="about"), + path("contact/", contact, name="contact"), + path("faq/", faq, name="faq"), ] diff --git a/core/views.py b/core/views.py index fff1779..3313453 100644 --- a/core/views.py +++ b/core/views.py @@ -1,5 +1,9 @@ -from django.shortcuts import render -from .models import Property +from django.shortcuts import render, redirect, get_object_or_404 +from django.contrib.auth import login, authenticate, logout +from django.contrib.auth.forms import UserCreationForm, AuthenticationForm +from django.contrib.auth.decorators import login_required +from .forms import PropertyForm, BookingForm +from .models import Property, Booking def index(request): properties = Property.objects.all()[:6] @@ -7,3 +11,76 @@ def index(request): 'properties': properties } return render(request, 'core/index.html', context) + +def property_detail(request, property_id): + property = get_object_or_404(Property, pk=property_id) + return render(request, 'core/property_detail.html', {'property': property}) + +def signup_view(request): + if request.method == 'POST': + form = UserCreationForm(request.POST) + if form.is_valid(): + user = form.save() + login(request, user) + return redirect('index') + else: + form = UserCreationForm() + return render(request, 'core/signup.html', {'form': form}) + +def login_view(request): + if request.method == 'POST': + form = AuthenticationForm(data=request.POST) + if form.is_valid(): + user = form.get_user() + login(request, user) + return redirect('index') + else: + form = AuthenticationForm() + return render(request, 'core/login.html', {'form': form}) + +def logout_view(request): + if request.method == 'POST': + logout(request) + return redirect('index') + +@login_required +def property_create(request): + if request.method == 'POST': + form = PropertyForm(request.POST, request.FILES) + if form.is_valid(): + property = form.save(commit=False) + property.owner = request.user + property.save() + return redirect('property_detail', property_id=property.id) + else: + form = PropertyForm() + return render(request, 'core/property_create.html', {'form': form}) + +@login_required +def booking_create(request, property_id): + property = get_object_or_404(Property, pk=property_id) + if request.method == 'POST': + form = BookingForm(request.POST) + if form.is_valid(): + booking = form.save(commit=False) + booking.property = property + booking.user = request.user + booking.save() + return redirect('profile') + else: + form = BookingForm() + return render(request, 'core/booking_create.html', {'form': form, 'property': property}) + +@login_required +def profile(request): + bookings = Booking.objects.filter(user=request.user) + return render(request, 'core/profile.html', {'bookings': bookings}) + +def about(request): + return render(request, 'core/about.html') + +def contact(request): + return render(request, 'core/contact.html') + +def faq(request): + return render(request, 'core/faq.html')