Skip to content

Commit 1e9d83f

Browse files
committed
Added view models for the remaining view methods (not recorded).
1 parent 9402569 commit 1e9d83f

File tree

10 files changed

+86
-64
lines changed

10 files changed

+86
-64
lines changed

app/ch13-validation/final/pypi_org/templates/cms/page.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
{% block title %}About PyPI Demo{% endblock %}
33

44
{% block main_content %}
5-
<h1>{{ page_title }}</h1>
5+
<h1>{{ page.page_title }}</h1>
66

77
<div>
8-
{{ page_details }}
8+
{{ page.page_details }}
99
</div>
1010
{% endblock %}

app/ch13-validation/final/pypi_org/viewmodels/account/index_viewmodel.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
class IndexViewModel(ViewModelBase):
66
def __init__(self):
77
super().__init__()
8-
self.user = user_service.find_user_by_id(self.user_id)
8+
self.user = user_service.find_user_by_id(self.user_id)
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from pypi_org.services import user_service
2+
from pypi_org.viewmodels.shared.viewmodelbase import ViewModelBase
3+
4+
5+
class LoginViewModel(ViewModelBase):
6+
def __init__(self):
7+
super().__init__()
8+
self.email = self.request_dict.email.lower().strip()
9+
self.password = self.request_dict.password.strip()
10+
11+
def validate(self):
12+
if not self.email or not self.email.strip():
13+
self.error = 'You must specify a email.'
14+
elif not self.password:
15+
self.error = 'You must specify a password.'
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from pypi_org.services import user_service, cms_service
2+
from pypi_org.viewmodels.shared.viewmodelbase import ViewModelBase
3+
4+
5+
class PageViewModel(ViewModelBase):
6+
def __init__(self, full_url: str):
7+
super().__init__()
8+
9+
self.page = cms_service.get_page(full_url)
10+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from pypi_org.services import user_service, package_service
2+
from pypi_org.viewmodels.shared.viewmodelbase import ViewModelBase
3+
4+
5+
class IndexViewModel(ViewModelBase):
6+
def __init__(self):
7+
super().__init__()
8+
9+
self.releases = package_service.get_latest_releases()
10+
self.package_count = package_service.get_package_count()
11+
self.release_count = package_service.get_release_count()
12+
self.user_count = user_service.get_user_count()
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from pypi_org.services import user_service, package_service
2+
from pypi_org.viewmodels.shared.viewmodelbase import ViewModelBase
3+
4+
5+
class PackageDetailsViewModel(ViewModelBase):
6+
def __init__(self, package_name: str):
7+
super().__init__()
8+
self.package_name = package_name
9+
self.package = None
10+
if package_name:
11+
self.package_name = package_name.strip().lower()
12+
self.package = package_service.get_package_by_id(self.package_name)
13+
14+
self.latest_version = "0.0.0"
15+
self.latest_release = None
16+
self.is_latest = True
17+
18+
if self.package and self.package.releases:
19+
self.latest_release = self.package.releases[0]
20+
self.latest_version = self.latest_release.version_text
21+
22+
self.release_version = self.latest_release

app/ch13-validation/final/pypi_org/views/account_views.py

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import flask
22

3-
from pypi_org.infrastructure import request_dict
43
from pypi_org.infrastructure.view_modifiers import response
54
from pypi_org.services import user_service
65
import pypi_org.infrastructure.cookie_auth as cookie_auth
76
from pypi_org.viewmodels.account.index_viewmodel import IndexViewModel
7+
from pypi_org.viewmodels.account.login_viewmodel import LoginViewModel
88
from pypi_org.viewmodels.account.register_viewmodel import RegisterViewModel
99

1010
blueprint = flask.Blueprint('account', __name__, template_folder='templates')
@@ -57,33 +57,23 @@ def register_post():
5757
@blueprint.route('/account/login', methods=['GET'])
5858
@response(template_file='account/login.html')
5959
def login_get():
60-
return {}
60+
vm = LoginViewModel()
61+
return vm.to_dict()
6162

6263

6364
@blueprint.route('/account/login', methods=['POST'])
6465
@response(template_file='account/login.html')
6566
def login_post():
66-
data = request_dict.create(default_val='')
67-
68-
email = data.email.lower().strip()
69-
password = data.password.strip()
67+
vm = LoginViewModel()
68+
vm.validate()
7069

71-
if not email or not password:
72-
return {
73-
'email': email,
74-
'password': password,
75-
'error': "Some required fields are missing.",
76-
'user_id': cookie_auth.get_user_id_via_auth_cookie(flask.request),
77-
}
70+
if vm.error:
71+
return vm.to_dict()
7872

79-
user = user_service.login_user(email, password)
73+
user = user_service.login_user(vm.email, vm.password)
8074
if not user:
81-
return {
82-
'email': email,
83-
'password': password,
84-
'error': "The account does not exist or the password is wrong.",
85-
'user_id': cookie_auth.get_user_id_via_auth_cookie(flask.request),
86-
}
75+
vm.error = "The account does not exist or the password is wrong."
76+
return vm.to_dict()
8777

8878
resp = flask.redirect('/account')
8979
cookie_auth.set_auth(resp, user.id)
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
import flask
22

33
from pypi_org.infrastructure.view_modifiers import response
4-
import pypi_org.services.cms_service as cms_service
4+
from pypi_org.viewmodels.cms.page_viewmodel import PageViewModel
55

66
blueprint = flask.Blueprint('cms', __name__, template_folder='templates')
77

88

99
@blueprint.route('/<path:full_url>')
1010
@response(template_file='cms/page.html')
1111
def cms_page(full_url: str):
12-
print("Getting CMS page for {}".format(full_url))
12+
vm = PageViewModel(full_url)
1313

14-
page = cms_service.get_page(full_url)
15-
if not page:
14+
if not vm.page:
1615
return flask.abort(404)
1716

18-
return page
17+
return vm.to_dict()
Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,21 @@
11
import flask
22

3-
from pypi_org.infrastructure import cookie_auth
43
from pypi_org.infrastructure.view_modifiers import response
5-
import pypi_org.services.package_service as package_service
6-
import pypi_org.services.user_service as user_service
4+
from pypi_org.viewmodels.home.index_viewmodel import IndexViewModel
5+
from pypi_org.viewmodels.shared.viewmodelbase import ViewModelBase
76

87
blueprint = flask.Blueprint('home', __name__, template_folder='templates')
98

109

1110
@blueprint.route('/')
1211
@response(template_file='home/index.html')
1312
def index():
14-
return {
15-
'releases': package_service.get_latest_releases(),
16-
'package_count': package_service.get_package_count(),
17-
'release_count': package_service.get_release_count(),
18-
'user_count': user_service.get_user_count(),
19-
'user_id': cookie_auth.get_user_id_via_auth_cookie(flask.request),
20-
}
13+
vm = IndexViewModel()
14+
return vm.to_dict()
2115

2216

2317
@blueprint.route('/about')
2418
@response(template_file='home/about.html')
2519
def about():
26-
return {
27-
'user_id': cookie_auth.get_user_id_via_auth_cookie(flask.request),
28-
}
20+
vm = ViewModelBase()
21+
return vm.to_dict()

app/ch13-validation/final/pypi_org/views/package_views.py

Lines changed: 4 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,19 @@
11
import flask
22

3-
from pypi_org.infrastructure import cookie_auth
43
from pypi_org.infrastructure.view_modifiers import response
5-
import pypi_org.services.package_service as package_service
4+
from pypi_org.viewmodels.packages.pagedetails_viewmodel import PackageDetailsViewModel
65

76
blueprint = flask.Blueprint('packages', __name__, template_folder='templates')
87

98

109
@blueprint.route('/project/<package_name>')
1110
@response(template_file='packages/details.html')
1211
def package_details(package_name: str):
13-
if not package_name:
12+
vm = PackageDetailsViewModel(package_name)
13+
if not vm.package:
1414
return flask.abort(status=404)
1515

16-
package = package_service.get_package_by_id(package_name.strip().lower())
17-
if not package:
18-
return flask.abort(status=404)
19-
20-
latest_version = "0.0.0"
21-
latest_release = None
22-
is_latest = True
23-
24-
if package.releases:
25-
latest_release = package.releases[0]
26-
latest_version = latest_release.version_text
27-
28-
return {
29-
'package': package,
30-
'latest_version': latest_version,
31-
'latest_release': latest_release,
32-
'release_version': latest_release,
33-
'is_latest': is_latest,
34-
'user_id': cookie_auth.get_user_id_via_auth_cookie(flask.request),
35-
}
16+
return vm.to_dict()
3617

3718

3819
@blueprint.route('/<int:rank>')

0 commit comments

Comments
 (0)