Skip to content

Commit 4f871b1

Browse files
merging adiela to dev
2 parents e075da8 + 14ca46f commit 4f871b1

File tree

12 files changed

+483
-56
lines changed

12 files changed

+483
-56
lines changed

app/auth/forms.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
from flask_wtf import FlaskForm
2-
from wtforms import StringField,PasswordField,SubmitField, BooleanField
3-
from wtforms.validators import Required,Email,EqualTo
2+
from wtforms import StringField, PasswordField, SubmitField, BooleanField, FileField, TextAreaField
3+
from wtforms.validators import DataRequired, Email, EqualTo
44
from ..models import User
55
from wtforms import ValidationError
66

77

88
class RegistrationForm(FlaskForm):
99

10-
email = StringField('Your Email Address',validators=[Required(),Email()])
11-
username = StringField('Enter your username',validators = [Required()])
12-
password = PasswordField('Password',validators = [Required(),
13-
EqualTo('password_confirm',message = 'Passwords must match')])
14-
password_confirm = PasswordField('Confirm Passwords',validators = [Required()])
10+
email = StringField('Your Email Address', validators=[Email(), DataRequired()])
11+
username = StringField('Enter your username', validators=[DataRequired()])
12+
password = PasswordField('Password', validators=[DataRequired(), EqualTo('password_confirm', message='Passwords must match')])
13+
password_confirm = PasswordField('Confirm Passwords', validators=[DataRequired()])
1514
submit = SubmitField('Sign Up')
1615

1716
def validate_email(self,data_field):
@@ -24,7 +23,26 @@ def validate_username(self,data_field):
2423

2524

2625
class LoginForm(FlaskForm):
27-
email = StringField('Your Email Address',validators=[Required(),Email()])
28-
password = PasswordField('Password',validators =[Required()])
26+
email = StringField('Your Email Address', validators=[DataRequired(), Email()])
27+
password = PasswordField('Password', validators=[DataRequired()])
2928
remember = BooleanField('Remember me')
30-
submit = SubmitField('Sign In')
29+
submit = SubmitField('Sign In')
30+
31+
32+
class UpdateProfileForm(FlaskForm):
33+
34+
profile_pic = FileField('Profile Picture', validators=[])
35+
bio = TextAreaField('Bio')
36+
email = StringField('Your Email Address', validators=[Email(), DataRequired()])
37+
username = StringField('Enter your username', validators=[DataRequired()])
38+
password = PasswordField('Password', validators=[DataRequired(), EqualTo('password_confirm', message='Passwords must match')])
39+
password_confirm = PasswordField('Confirm Passwords', validators=[DataRequired()])
40+
submit = SubmitField('Sign Up')
41+
42+
def validate_email(self, email):
43+
if User.query.filter_by(email=email.data).first():
44+
raise ValidationError('There is an account with that email')
45+
46+
def validate_username(self, username):
47+
if User.query.filter_by(username=username.data).first():
48+
raise ValidationError('That username is taken')

app/main/forms.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
11
from flask_wtf import FlaskForm
2-
from wtforms import StringField, SubmitField, MultipleFileField, SelectField, IntegerField, DateField, TimeField, TextAreaField
3-
from wtforms.validators import Required
2+
from flask_wtf.file import FileField, FileAllowed
3+
from wtforms import SubmitField, MultipleFileField, SelectField, IntegerField, DateField, TimeField, TextAreaField, StringField
4+
from wtforms.validators import DataRequired
45
from ..models import User
56
from wtforms import ValidationError
67

78

89
class ListingForm(FlaskForm):
9-
images = MultipleFileField('Upload a few images',validators=[FileAllowed(['jpg', 'png']), Required])
10+
images = MultipleFileField('Upload a few images', validators=[FileAllowed(['jpg', 'png']), DataRequired()])
1011
location = SelectField('Neighbourhood', choices=[('eastleigh', 'Eastleigh'), ('karen', 'Karen'),
1112
('kileleshwa', 'Kileleshwa'), ('Langata', 'Langata'),
1213
('lavington', 'Lavington'), ('muthaiga', 'Muthaiga'),
1314
('ngara', 'Ngara'), ('runda', 'Runda'), ('donholm', 'Donholm'),
1415
('south-B', 'South-B'), ('south-C', 'South-C'),
1516
('upperhill', 'Upperhill'), ('westlands', 'Westlands')])
16-
category = SelectField('Type', validators=[Required], choices=[('apartment', 'Apartment'),
17+
category = SelectField('Type', validators=[DataRequired()], choices=[('apartment', 'Apartment'),
1718
('bungalow', 'Bungalow'),
1819
('maisonette', 'Maisonette')])
19-
bedrooms = SelectField('Size', validators=[Required], choices=[('bedsitter', 'Bedsitter'), ('1 Bedroom', '1 Bedroom'),
20+
bedrooms = SelectField('Size', validators=[DataRequired()], choices=[('bedsitter', 'Bedsitter'), ('1 Bedroom', '1 Bedroom'),
2021
('2 Bedroom', '2 Bedroom'), ('3 Bedroom', '3 Bedroom'),
2122
('4 Bedroom', '4 Bedroom')])
22-
pricing = IntegerField('Price', validators=[Required])
23-
description = TextAreaField('Description', validators=[Required])
24-
view_date = DateField('Date', validators=[Required])
25-
view_start_time = TimeField('From', min="9:00", max="18:00", validators=[Required])
26-
view_end_time = TimeField('To', validators=[Required])
23+
pricing = IntegerField('Price', format="%d/%m/%Y", validators=[DataRequired()])
24+
description = TextAreaField('Description', validators=[DataRequired()])
25+
view_date = DateField('Date', validators=[DataRequired()])
26+
view_start_time = TimeField('From', validators=[DataRequired()])
27+
view_end_time = TimeField('To', validators=[DataRequired()])
2728
submit = SubmitField('Submit')

app/static/css/listing.css

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
.listing-container{
2+
padding-top: 10vh;
3+
color: #555555;
4+
}
5+
.listing-header{
6+
margin-bottom: 20px;
7+
padding: 10px;
8+
}
9+
.left-col{
10+
margin: 20px;
11+
}
12+
table{
13+
width: 100%;
14+
margin-bottom: 20px;
15+
}
16+
td {
17+
padding: 12px;
18+
font-size: 20px;
19+
20+
text-align: left;
21+
border-bottom: 1px solid #ddd;
22+
}
23+
.btn-book{
24+
color: #fff;
25+
background-color: #008b8b;
26+
border-radius: 0;
27+
margin: 20px;
28+
float: right;
29+
}
30+
#booking-form{
31+
padding: 20px;
32+
}
251 KB
Loading
308 KB
Loading
195 KB
Loading
243 KB
Loading

app/templates/base.html

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,33 @@
1+
2+
3+
14
{% extends 'bootstrap/base.html' %}
25

6+
7+
8+
9+
<!-- Styles block -->
10+
11+
{% block styles%}
12+
{{ super() }}
13+
<link href="https://fonts.googleapis.com/css?family=PT+Serif:400,400i,700,700i|Roboto:300,400,700|PT+Sans:400,400i,700,700i" rel="stylesheet">
14+
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
15+
<link rel="stylesheet" href="{{url_for('static',filename='css/index.css')}}">
16+
{% endblock %}
17+
318
<!-- Navbar block -->
419
{% block navbar %}
520

621
{% include 'navbar.html' %}
7-
22+
823
{% endblock %}
24+
25+
{% block scripts %}
26+
{{super()}}
27+
28+
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
29+
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
30+
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
31+
<script src="{{url_for('static',filename='js/navbar.js')}}"></script>
32+
{% endblock %}
33+

app/templates/booking.html

Whitespace-only changes.

app/templates/index.html

Lines changed: 213 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,222 @@
44
{% block content %}
55

66
<title> {{ title }} </title>
7+
<div class="container-fluid">
78

8-
<div class="container">
99

10-
<h1>Home Page</h1>
10+
<div class="landing">
1111

12+
<div class="landing-page">
13+
<div class="cover">
14+
<nav class="categories">
15+
<div class="nav nav-tabs ml-auto" id="nav-tab" role="tablist">
16+
<a class="nav-item nav-link active" id="nav-home-tab" data-toggle="tab" href="#nav-home" role="tab" aria-controls="nav-home" aria-selected="true">Home</a>
17+
<a class="nav-item nav-link" id="nav-profile-tab" data-toggle="tab" href="#nav-profile" role="tab" aria-controls="nav-profile" aria-selected="false">Profile</a>
18+
<a class="nav-item nav-link" id="nav-contact-tab" data-toggle="tab" href="#nav-contact" role="tab" aria-controls="nav-contact" aria-selected="false">Contact</a>
19+
</div>
20+
</nav>
21+
</div>
22+
</div>
1223
</div>
1324

25+
<div class="tab-content" id="nav-tabContent">
26+
<div class="tab-pane fade show active" id="nav-home" role="tabpanel" aria-labelledby="nav-home-tab">
27+
..Home.
28+
<div class="container">
29+
<div class="row">
30+
<div class="col-sm-6 col-md-4 wrapper">
31+
<div class="text">
32+
33+
<div class="">
34+
<div class="card article">
35+
<a href="#" target="_blank">
36+
<img class="card-img-top" src="{{url_for('static',filename = 'images/1.jpg')}}" alt="Image of ">
37+
</a>
38+
<div class="card-body">
39+
<h4 class="card-title">Listing description</h4>
40+
<p class="metadata">Agent</p>
41+
<p class="metadata">Location</p>
42+
<hr>
43+
</div>
44+
</div>
45+
</div>
46+
47+
</div>
48+
</div>
49+
<div class="col-sm-6 col-md-4 wrapper">
50+
<div class="text">
51+
52+
<div class="">
53+
<div class="card article">
54+
<a href="#" target="_blank">
55+
<img class="card-img-top" src="{{url_for('static',filename = 'images/2.jpg')}}" alt="Image of ">
56+
</a>
57+
<div class="card-body">
58+
<h4 class="card-title">Listing description</h4>
59+
<p class="metadata">Agent</p>
60+
<p class="metadata">Location</p>
61+
<hr>
62+
</div>
63+
</div>
64+
</div>
65+
66+
</div>
67+
</div>
68+
<div class="col-sm-6 col-md-4 wrapper">
69+
<div class="text">
70+
71+
<div class="">
72+
<div class="card article">
73+
<a href="#" target="_blank">
74+
<img class="card-img-top" src="{{url_for('static',filename = 'images/4.jpg')}}" alt="Image of ">
75+
</a>
76+
<div class="card-body">
77+
<h4 class="card-title">Listing description</h4>
78+
<p class="metadata">Agent</p>
79+
<p class="metadata">Location</p>
80+
<hr>
81+
</div>
82+
</div>
83+
</div>
84+
85+
</div>
86+
</div>
87+
</div>
88+
</div>
89+
90+
</div>
91+
<div class="tab-pane fade" id="nav-profile" role="tabpanel" aria-labelledby="nav-profile-tab">
92+
...Profile
93+
<div class="container">
94+
<div class="row">
95+
<div class="col-sm-6 col-md-4 wrapper">
96+
<div class="text">
97+
98+
<div class="">
99+
<div class="card article">
100+
<a href="#" target="_blank">
101+
<img class="card-img-top" src="{{url_for('static',filename = 'images/2.jpg')}}" alt="Image of ">
102+
</a>
103+
<div class="card-body">
104+
<h4 class="card-title">Listing description</h4>
105+
<p class="metadata">Agent</p>
106+
<p class="metadata">Location</p>
107+
<hr>
108+
</div>
109+
</div>
110+
</div>
111+
112+
</div>
113+
</div>
114+
<div class="col-sm-6 col-md-4 wrapper">
115+
<div class="text">
116+
117+
<div class="">
118+
<div class="card article">
119+
<a href="#" target="_blank">
120+
<img class="card-img-top" src="{{url_for('static',filename = 'images/4.jpg')}}" alt="Image of ">
121+
</a>
122+
<div class="card-body">
123+
<h4 class="card-title">Listing description</h4>
124+
<p class="metadata">Agent</p>
125+
<p class="metadata">Location</p>
126+
<hr>
127+
</div>
128+
</div>
129+
</div>
130+
131+
</div>
132+
</div>
133+
<div class="col-sm-6 col-md-4 wrapper">
134+
<div class="text">
135+
136+
<div class="">
137+
<div class="card article">
138+
<a href="#" target="_blank">
139+
<img class="card-img-top" src="{{url_for('static',filename = 'images/1.jpg')}}" alt="Image of ">
140+
</a>
141+
<div class="card-body">
142+
<h4 class="card-title">Listing description</h4>
143+
<p class="metadata">Agent</p>
144+
<p class="metadata">Location</p>
145+
<hr>
146+
</div>
147+
</div>
148+
</div>
149+
150+
</div>
151+
</div>
152+
</div>
153+
</div>
154+
</div>
155+
<div class="tab-pane fade" id="nav-contact" role="tabpanel" aria-labelledby="nav-contact-tab">
156+
...Contact
157+
<div class="container">
158+
<div class="row">
159+
<div class="col-sm-6 col-md-4 wrapper">
160+
<div class="text">
161+
162+
<div class="">
163+
<div class="card article">
164+
<a href="#" target="_blank">
165+
<img class="card-img-top" src="{{url_for('static',filename = 'images/4.jpg')}}" alt="Image of ">
166+
</a>
167+
<div class="card-body">
168+
<h4 class="card-title">Listing description</h4>
169+
<p class="metadata">Agent</p>
170+
<p class="metadata">Location</p>
171+
<hr>
172+
</div>
173+
</div>
174+
</div>
175+
176+
</div>
177+
</div>
178+
<div class="col-sm-6 col-md-4 wrapper">
179+
<div class="text">
180+
181+
<div class="">
182+
<div class="card article">
183+
<a href="#" target="_blank">
184+
<img class="card-img-top" src="{{url_for('static',filename = 'images/2.jpg')}}" alt="Image of ">
185+
</a>
186+
<div class="card-body">
187+
<h4 class="card-title">Listing description</h4>
188+
<p class="metadata">Agent</p>
189+
<p class="metadata">Location</p>
190+
<hr>
191+
</div>
192+
</div>
193+
</div>
194+
195+
</div>
196+
</div>
197+
<div class="col-sm-6 col-md-4 wrapper">
198+
<div class="text">
199+
200+
<div class="">
201+
<div class="card article">
202+
<a href="#" target="_blank">
203+
<img class="card-img-top" src="{{url_for('static',filename = 'images/1.jpg')}}" alt="Image of ">
204+
</a>
205+
<div class="card-body">
206+
<h4 class="card-title">Listing description</h4>
207+
<p class="metadata">Agent</p>
208+
<p class="metadata">Location</p>
209+
<hr>
210+
</div>
211+
</div>
212+
</div>
213+
214+
</div>
215+
</div>
216+
</div>
217+
</div>
218+
</div>
219+
</div>
220+
221+
222+
</div>
223+
224+
14225
{% endblock %}

0 commit comments

Comments
 (0)