def create_or_update(cls, connection, **values): """Create or Update an activity row in 'activity_goal' table :param connection: DB connection object :param values: activity_goal payload { 'user_id': <user-id>, 'goal_id': <goal-id>, } :return: boolean output """ session = connection.SESSION create_or_update = True try: activity_obj = session.query(schema.ActivityGoal).filter_by(**values).one() goal_count = Goal.get(connection, values.get(GOAL_ID_KEY)).get(COUNT_KEY) if goal_count < activity_obj.frequency + 1: raise Exception("Reached the required goal count") setattr(activity_obj, FREQUENCY_KEY, activity_obj.frequency + 1) completed_on = literal_eval(activity_obj.completed_on) completed_on[str(activity_obj.frequency)] = get_utc_time().strftime(TIME_FORMAT) setattr(activity_obj, COMPLETED_ON_KEY, completed_on) setattr(activity_obj, LAST_UPDATED_AT_KEY, get_utc_time()) if goal_count == activity_obj.frequency: setattr(activity_obj, COMPLETED_KEY, True) session.commit() except NoResultFound as _: values[COMPLETED_ON_KEY] = dict([(str(1), get_utc_time().strftime(TIME_FORMAT))]) session.add(schema.ActivityGoal(**values)) session.commit() except Exception as e: print "Exception occurred during querying (INSERT/UPDATE) the activity_goal table: %s" % e session.rollback() create_or_update = False finally: session.close() return create_or_update