Conference Organization application, allowing users to create conference, manage sessions and speakers, among other functionalities.
- Update the value of
application
inapp.yaml
to the app ID you have registered in the App Engine admin console and would like to use to host your instance of this sample. - Update the values at the top of
settings.py
to reflect the respective client IDs you have registered in the Developer Console. - Update the value of CLIENT_ID in
static/js/app.js
to the Web client ID - (Optional) Mark the configuration files as unchanged as follows:
$ git update-index --assume-unchanged app.yaml settings.py static/js/app.js
- Run the app with the devserver using
dev_appserver.py DIR
, and ensure it's running by visiting your local server's address (by default localhost:8080.) - (Optional) Generate your client library(ies) with the endpoints tool.
- Deploy your application.
- Each Conference entity has a Profile entity as an ancestor
- Each Session entity has a Conference entity as an ancestor
- Each Session entity has a
HAS-A
relationship with a SessionSpeaker entity. In case no speaker is specified, it is defaulted to one with ID/emailNA
- SessionSpeaker entities are stored separately from Profile entities, even if they belong to the same person. This allows for modularity, such that modification in one entity does not affect the other.
- The application stores SessionSpeaker as an entity instead of a simple StringProperty/StructuredProperty of Session entity. This allows for scalability: when additional information about speakers are needed, such as description, resume, those can be added without significant modification to the codebase.
- SessionSpeaker entities have no ancestor. They are uniquely identified by their speakers' email address because email addresses are unique.
- Each Session entities consist of
name
,highlight
,speaker
(identified by email),duration
,date
andstartTime
. - Session name is required due to designer's (me) preference.
name
,highlight
,speakerEmail
areStringProperty
.highlight
can be changed toTextProperty
if necessary. All of them are indexed by default. In the future, if memory becomes a problem,highlight
does not need to be indexed.duration
isFloatProperty
. It should specified session duration in terms of hour (i.e. 1h30 -> 1.5). This allows for inequality filters onduration
property.date
isStringProperty
. It should beDateProperty
instead but the application usesStringProperty
because of shipping deadline.startTime
isTimeProperty
.
- User wishlist is stored in his/her Profile entity. This wishlist consists list of URL safe Session IDs
- User can add, remove and view his/her wishlist
getConferenceSessionBySpeaker
: Get all sessions by a specified speaker in a specified conference. The application already had a function to filter session by speaker email. It would be useful to filter by conference as well.getConferenceSessionByDuration
: Get all sessions in the specified conference and shorter than a specified amount of time.
- Name of function is
getSessionByComplexInequality
- In this task, the app let users specified
SESSION TYPE
andHOUR
. It will then queries all sessions that are different fromSESSION TYPE
and starts beforeHOUR
- This is a tricky problem, given that datastore queries only allow 1 property to have inequality filter
- This problem can be solved by performing the second inequality filter on local server after fetching data using the first inequality filter.
- If a Speaker has two or more sessions at any conference, he/she becomes a featured speaker for that conference
- List of featured speakers are stored in Memcache
- After a session is created, a background task is added to PushQueue. This task checks if the session's speaker is a featured speaker; if yes, this speaker ID is cached in Memcache.