def put(self): data = request.form user_data = UserData.get_from_username(data['username']) if not user_data: raise Exception("I don't know that person") event = Event.get_from_name(data['event_name']) if not event: raise Exception("I don't know that event") point_record = PointRecord.query(PointRecord.event_name == event.name, PointRecord.username == user_data.username).get() # TODO (phillip): this might allow me to not create new records every time a # new event or user is created because a record will be created when # the client tries to modify a record that should exist # Create a point record if one does not exist if not point_record: # TODO (phillip): does this work with the user key as the ancestor? point_record = PointRecord(parent=user_data.key) point_record.event_name = event.name point_record.username = user_data.username point_record.points_earned = float(data['points-earned']) point_record.put() # TODO (phillip): A put request (and really any other request that creates or # updates an object) should return the new representation of that # object so clients don't need to make more API calls response = jsonify() response.status_code = 204 return response
def post(self): """ Creates a new event. """ data = request.form # Don't allow duplicate events event = Event.get_from_name(data['name']) if event is not None: response = jsonify(message="Duplicate resource") response.status_code = 409 return response # Get the point category by name point_category = PointCategory.get_from_name(data['point-category']) if point_category is None: raise Exception("Unknonwn point category: " + data['point-category']) new_event = Event(parent=Event.root_key()) new_event.date = datetime.strptime(data['date'], "%Y-%m-%d") new_event.name = data['name'] new_event.point_category = point_category.key new_event.put() # Make sure there are point records for this event new_event.populate_records() response = jsonify() response.status_code = 201 response.headers['location'] = "/api/events/" + new_event.name.replace(" ", "") return response
def get(self): event_name = request.args.get("event_name", "all") username = request.args.get("username", "all") records = PointRecord.query() # TODO (phillip): probably shouldn't make these special cases? if event_name != "all": records = records.filter(PointRecord.event_name == event_name) if username != "all": records = records.filter(PointRecord.username == username) records = records.order(PointRecord.username) out = {'records': []} for record in records: event = Event.get_from_name(record.event_name) if event is None: logging.error("Tried to get a point record with an invalid event name: " + record.event_name) record.key.delete() continue point_cat = event.point_category.get().name out['records'].append({ 'event_name': record.event_name, 'username': record.username, 'points-earned': record.points_earned, 'point-category': point_cat, }) return jsonify(**out)
def delete(self, event): event = Event.get_from_name(event) if event is None: # TODO (phillip): this code is duplicated, maybe make some sort of default # handler that can be called for any resource that doesn't exist? response = jsonify(message="Resource does not exist") response.status_code = 404 return response event.delete()
def put(self, event): data = request.form new_event_name = data['name'] dup_event = Event.get_from_name(new_event_name) # Don't allow duplicate events if dup_event is not None and new_event_name.replace(" ", "") != event.replace(" ", ""): response = jsonify(message="Duplicate resource") response.status_code = 409 return response event = Event.get_from_name(event) if event is None: # TODO (phillip): this code is duplicated, maybe make some sort of default # handler that can be called for any resource that doesn't exist? response = jsonify(message="Resource does not exist") response.status_code = 404 return response # Get the point category by name point_category = PointCategory.get_from_name(data['point-category']) if point_category is None: raise Exception("Unknonwn point category: " + data['point-category']) records = PointRecord.query(PointRecord.event_name == event.name) for record in records: record.event_name = data['name'] record.put() event.name = data['name'] event.date = datetime.strptime(data['date'], "%Y-%m-%d") event.point_category = point_category.key event.put() response = jsonify() response.status_code = 201 response.headers['location'] = "/api/events/" + event.name.replace(" ", "") return response
def get(self, event): event = Event.get_from_name(event) if event is None: # TODO (phillip): this code is duplicated, maybe make some sort of default # handler that can be called for any resource that doesn't exist? response = jsonify(message="Resource does not exist") response.status_code = 404 return response out = { u'name': event.name, u'date': event.date.strftime('%m/%d/%Y'), u'point-category': event.point_category.get().name, } return jsonify(**out)
def get(self, user_id): output = {u"categories": {}} user = UserData.get_user_from_id(user_id) point_exceptions = {exc.point_category: exc.points_needed for exc in user.point_exceptions} categories = PointCategory.query(ancestor=PointCategory.root_key()) for cat in categories: # TODO (phillip): Write tests to test the behavior when calculating requirement for # a category with children having a higher requirement. (i.e. max(self, children)) # TODO (phillip): remove some of the ugly repeated code below # Add each category and the required number of points if user.is_baby(): requirement = cat.baby_requirement if requirement is None: requirement = 0 sub_req_list = [] for sub in cat.sub_categories: req = sub.get().member_requirement if req is None: sub_req_list.append(0) else: sub_req_list.append(req) sub_req = sum(sub_req_list) requirement = max(requirement, sub_req) else: requirement = cat.member_requirement if requirement is None: requirement = 0 # TODO (phillip): add test when one of the requirements is None sub_req_list = [] for sub in cat.sub_categories: req = sub.get().member_requirement if req is None: sub_req_list.append(0) else: sub_req_list.append(req) sub_req = sum(sub_req_list) requirement = max(requirement, sub_req) if cat.name in point_exceptions: requirement = point_exceptions[cat.name] output["categories"][cat.name] = {u"required": requirement} output["categories"][cat.name]["received"] = 0 if cat.parent is not None: output["categories"][cat.name]["level"] = 2 else: output["categories"][cat.name]["level"] = 1 # NOTE: At this point I am assuming each category has been added to # the output. If this is not true, the following code will fail # miserably. records = PointRecord.query() # username = user.username records = records.filter(PointRecord.username == user.username) for record in records: event = Event.get_from_name(record.event_name) if event is None: logging.error("Uknown event " + record.event_name + " requested for point record: " + str(record)) record.key.delete() continue category = event.point_category.get() if record.points_earned is None: record.points_earned = 0 record.put() output["categories"][category.name]["received"] += record.points_earned # Make sure to also count the points for the parent category if category.parent is not None: output["categories"][category.parent.name]["received"] += record.points_earned output["categories"][category.name]["level"] = 2 output = self.reshape_categories(output) return jsonify(**output)
def event(event): event = Event.get_from_name(event) template_values = { 'target_event': event, } return render_jinja_template('event.html', template_values)