Skip to content

Commit c3e661a

Browse files
committed
Fixing static content with dynamic content added video links
1 parent e34621f commit c3e661a

8 files changed

+132
-61
lines changed

api/api.py

+74-28
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,42 @@ def get(self):
1919
db.delete(c)
2020

2121

22-
2322
class CourseAPI(webapp.RequestHandler):
2423
def post(self):
25-
course=models.Course()
26-
course.course_id=self.request.get('course_id')
27-
course.course_type=self.request.get('course_type')
28-
#course.effective_date=self.request.get('effective_date')
29-
course.name=self.request.get('name')
30-
course.description=self.request.get('description')
31-
#course.status=self.request.get('status')
32-
course.min_students=int(self.request.get('min_students'))
33-
course.max_students=int(self.request.get('max_students'))
34-
#course.duration=self.request.get('duration')
35-
#course.education_units=self.request.get('education_units')
36-
course.put()
24+
if not self.request.get('course_id'):
25+
return
26+
27+
q = models.Course.gql("WHERE course_id = :1", self.request.get('course_id'))
28+
if q.count() > 0:
29+
c = q.fetch(1)[0]
30+
else:
31+
c = models.Course()
32+
c.course_id = self.request.get('course_id')
33+
34+
if self.request.get('course_type'):
35+
c.course_type = self.request.get('course_type')
36+
#if self.request.get('effective_date'):
37+
# c.effective_date = self.request.get('effective_date')
38+
if self.request.get('name'):
39+
c.name = self.request.get('name')
40+
if self.request.get('description'):
41+
c.description = self.request.get('description')
42+
#if self.request.get('status'):
43+
# c.status = self.request.get('status')
44+
if self.request.get('min_students'):
45+
c.min_students=int(self.request.get('min_students'))
46+
if self.request.get('max_students'):
47+
c.max_students=int(self.request.get('max_students'))
48+
#if self.request.get('duration'):
49+
# c.duration = self.request.get('duration')
50+
#if self.request.get('education_units'):
51+
# c.education_units = self.request.get('education_units')
52+
if self.request.get('mobile_video_url'):
53+
c.mobile_video_url=db.Link(self.request.get('mobile_video_url'))
54+
if self.request.get('mobile_video_url'):
55+
c.web_video_url=db.Link(self.request.get('mobile_video_url'))
56+
57+
c.put()
3758

3859
class PrerequisiteAPI(webapp.RequestHandler):
3960
def post(self):
@@ -48,21 +69,46 @@ def post(self):
4869

4970
class SessionAPI(webapp.RequestHandler):
5071
def post(self):
51-
session=models.Session()
52-
session.course=self.request.get('course')
53-
session.session_number=self.request.get('session_number')
54-
session.start_date=self.request.get('start_date')
55-
session.end_date=self.request.get('end_date')
56-
session.start_time=self.request.get('start_time')
57-
session.end_time=self.request.get('end_time')
58-
session.min_students=self.request.get('min_students')
59-
session.max_students=self.request.get('max_students')
60-
session.duration=self.request.get('duration')
61-
session.address=self.request.get('address')
62-
session.address2=self.request.get('address2')
63-
session.city=self.request.get('city')
64-
session.state=self.request.get('state')
65-
session.put()
72+
if not self.request.get('session_number'):
73+
return # Error
74+
75+
q = models.Session.gql("WHERE session_number = :1", self.request.get('session_number'))
76+
if q.count() > 0:
77+
s = q.fetch(1)[0]
78+
else:
79+
s = models.Session()
80+
s.session_number = self.request.get('session_number')
81+
82+
if self.request.get('course_id'):
83+
q = models.Course.gql("WHERE course_id = :1", self.request.get('course_id'))
84+
if q.count() > 0:
85+
s.course = self.request.get(q.fetch(1)[0].key())
86+
else:
87+
return # Error
88+
#if self.request.get('start_date'):
89+
# s.start_date = self.request.get('start_date')
90+
#if self.request.get('end_date'):
91+
# s.end_date = self.request.get('end_date')
92+
#if self.request.get('start_time'):
93+
# s.start_time = self.request.get('start_time')
94+
#if self.request.get('end_time'):
95+
# s.end_time = self.request.get('end_time')
96+
if self.request.get('min_students'):
97+
s.min_students = int(self.request.get('min_students'))
98+
if self.request.get('max_students'):
99+
s.max_students = int(self.request.get('max_students'))
100+
if self.request.get('duration'):
101+
s.duration = self.request.get('duration')
102+
if self.request.get('address'):
103+
s.address = self.request.get('address')
104+
if self.request.get('address2'):
105+
s.address2 = self.request.get('address2')
106+
if self.request.get('city'):
107+
s.city = self.request.get('city')
108+
if self.request.get('state'):
109+
s.state = self.request.get('state')
110+
111+
s.put()
66112

67113
application = webapp.WSGIApplication(
68114
[('/api/flush', FlushAPI),

app.yaml

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
application: wda-mobile
2-
version: 1
2+
version: 2
33
runtime: python
44
api_version: 1
55

@@ -22,6 +22,10 @@ handlers:
2222
- url: /api/.*
2323
script: api/api.py
2424

25+
- url: /admin/.*
26+
script: /admin/admin.py
27+
login: admin
28+
2529
- url: /search
2630
script: search.py
2731

course.html

+11-16
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,25 @@
1414

1515
<p>
1616

17-
<h1>MS Word 101</h1>
18-
6 hours (1 six-hour day–0.6 CEUs)
17+
<h1>{{ course.name }}
18+
{% if admin_link %}
19+
- <a href='{{ admin_link }}'>Edit</a>
20+
{% endif %}
21+
</h1>
22+
{{ course.duration }}
1923
<br/>
2024
<br/>
21-
<b>Description: </b> Public managers will receive an introduction to the skills and knowledge necessary to manage procurement, contracting and outsourcing activities. Managers will also be exposed to current and relevant case studies, from which they can draw principles to implement in their own organizations.
25+
<b>Description: </b> {{ course.description }}
2226
<br/>
2327
<br/>
24-
<b>Objectives: </b> Understand the responsibilities of line or program managers in the acquisition of goods and services, particularly in the day-to-day administration of procurement contracts and contractor relationships.
25-
Become familiar with the various types of contracts (e.g., fixed price, cost plus) and their relative strengths and weaknesses; be able to analyze a potential outsourcing situation or opportunity and understand how to develop a satisfactory statement of work.
26-
27-
<br/>
28-
<br/>
29-
<b>Competencies: </b> Customer Service
30-
<br/>
31-
<b>Who Should Attend: </b> MSS and Non-MSS managers and supervisors only (CPM graduates are exempt)
32-
<br/>
33-
<b>Prerequisites: </b> None
3428
</p>
3529
<hr style="border:1px dashed;color:58595b" width="100%"/>
3630
<h2>Available Sessions</h2>
3731

38-
<a href="/session?id=123">January 1st, 2011 - OJS</a> <br/>
39-
<a href="/session?id=123">January 31st, 2011 - OJS</a> <br/>
40-
<a href="/session?id=123">March 1st, 2011 - OJS</a> <br/>
32+
{% for session in sessions %}
33+
<a href="/session?session_number={{ session.session_number }}">{{ session.start_date }} {{ session.start_time }} {{ session.address }}</a> <br/>
34+
{% endfor %}
35+
4136

4237
<p>
4338
<a href="/">Home</a>

index.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def get(self):
2828
writer = ix.writer()
2929
writer.add_document(title=course.name, content=course.description, path=course.course_id)
3030
writer.commit()
31-
self.response.out.write("indexed %s <br/>" % (course.name))
31+
#self.response.out.write("indexed %s <br/>" % (course.name))
3232

3333
application = webapp.WSGIApplication(
3434
[('/api/index', IndexAPI)],

main.py

+32-8
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,53 @@
44
import wsgiref.handlers
55
from google.appengine.ext import webapp
66
from google.appengine.ext.webapp import template
7+
from google.appengine.api import users
8+
import models
79

810
class MainHandler(webapp.RequestHandler):
911
def get(self):
1012

11-
#query list of routes for dc-circulator
13+
# get categories
14+
# get subcategories
15+
1216
template_values = {}
1317
path = os.path.join(os.path.dirname(__file__), 'main.html')
1418
self.response.out.write(template.render(path, template_values))
1519

1620
class CourseHandler(webapp.RequestHandler):
1721
def get(self):
18-
19-
template_values = {'name': "course_name",
20-
'id':'course_id'}
22+
q = models.Course.gql("WHERE course_id = :1", self.request.get('course_id'))
23+
course = q.fetch(1)[0]
24+
25+
q = models.Session.gql("WHERE course_id = :1", course.key())
26+
sessions = []
27+
for session in q:
28+
sessions.append(session)
29+
30+
admin_link = None
31+
if users.is_current_user_admin():
32+
admin_link = '/admin/course?course_id=%s' % self.request.get('course_id')
33+
34+
template_values = { 'course': course,
35+
'sessions': sessions,
36+
'admin_link': admin_link,
37+
}
2138
path = os.path.join(os.path.dirname(__file__), 'course.html')
22-
self.response.out.write(template.render(path, template_values))
39+
self.response.out.write(template.render(path, template_values))
2340

2441

2542
class SessionHandler(webapp.RequestHandler):
2643
def get(self):
27-
28-
template_values = {'name': "course_name",
29-
'id':'course_id'}
44+
q = models.Session.gql("WHERE session_number = :1", self.request.get('session_number'))
45+
session = q.fetch(1)[0]
46+
47+
admin_link = None
48+
if users.is_current_user_admin():
49+
admin_link = '/admin/session?session_number=%s' % self.request.get('session_number')
50+
51+
template_values = { 'session': session,
52+
'admin_link': admin_link,
53+
}
3054
path = os.path.join(os.path.dirname(__file__), 'session.html')
3155
self.response.out.write(template.render(path, template_values))
3256

models.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class Course(db.Model):
1313
max_students=db.IntegerProperty()
1414
duration=db.IntegerProperty()
1515
education_units=db.IntegerProperty()
16+
mobile_video_url=db.LinkProperty()
17+
web_video_url=db.LinkProperty()
1618

1719
class Prerequisite(db.Model):
1820
#prerequisites

search.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<p>
2323
{% for r in results %}
2424
<b>
25-
<a href="/course?id={{r.id}}">{{ r.name }}</a>
25+
<a href="/course?course_id={{r.id}}">{{ r.name }}</a>
2626
</b>
2727
<br/>
2828
{% endfor %}

session.html

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@
1717

1818
<input type="submit" value="Register now!"></input>
1919

20-
<h1>MS Word 101</h1>
21-
6 hours (1 six-hour day–0.6 CEUs)
20+
<h1>{{ session.course.name }}</h1>
21+
{{ session.course.duration }}
2222
<br/>
2323
<br/>
24-
<b>Date: </b> January 1st, 2010
24+
<b>Date: </b> {{ session.start_date }}
2525
<br/>
26-
<b>Time: </b> 9am-5pm
26+
<b>Time: </b> {{ session.start_time }}
2727
<br/>
2828

29-
<b>Capacity: </b> 8-20 people
29+
<b>Capacity: </b> {{ session.min_people }}-{{ session.max_people }}
3030
<br/>
3131

3232
<br/>
33-
<b>Location: </b> 441 4th Str., NW, Suite 850S, <br/>Washington, DC 20001<br/>
33+
<b>Location: </b> {{ session.address }}, <br/>{{ session.city }}, {{ session.state }} {{ session.zip }}<br/>
3434

3535
<iframe width="300" height="300" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=441+4th+St+NW,+Washington,+DC+20001&amp;sll=37.0625,-95.677068&amp;sspn=62.057085,128.583984&amp;ie=UTF8&amp;hq=&amp;hnear=441+4th+St+NW,+Washington+D.C.,+District+of+Columbia,+20001&amp;ll=38.895442,-77.015877&amp;spn=0.02004,0.025749&amp;z=14&amp;output=embed"></iframe><br /><small><a href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=441+4th+St+NW,+Washington,+DC+20001&amp;sll=37.0625,-95.677068&amp;sspn=62.057085,128.583984&amp;ie=UTF8&amp;hq=&amp;hnear=441+4th+St+NW,+Washington+D.C.,+District+of+Columbia,+20001&amp;ll=38.895442,-77.015877&amp;spn=0.02004,0.025749&amp;z=14" style="color:#0000FF;text-align:left">View Larger Map</a></small>
3636

0 commit comments

Comments
 (0)