コード例 #1
0
 def connect(self,user_id):
     '''
     Connects/Joins an user with provided user_id with the activity for the current activity manager
     :param user_id:
     :return:
     '''
     (canJoin, message) = self.can_join(user_id)
     if not canJoin:
         return False, message
     #Need to validate whether the same user has signed up for the same activity
     #Count the number of companions first to handle the eventual consistency pattern for ndb
     companion_count = self.companion_count() + 1
     user_info = models.User.get_by_id(long(user_id))
     user_activity = UserActivity(user=user_info.key,
                                  activity=self._event.key)
     user_activity.put()
     #An activity will be marked as FORMED_OPEN if it satisfies the minm number of people required requirement
     if self._event.status == Event.FORMING:
         if self._can_complete(companion_count):
             self._event.status = Event.FORMED_OPEN
             self._event.put()
             self._on_event_formation()
             eventThrottler = EventThrottler(self.get_event().username)
             eventThrottler.decrement_activity_count()
     return True, message
コード例 #2
0
    def cancel(self):
        (canCancel, message) = self.can_cancel()
        if not canCancel:
            return False, message
        user_activities = UserActivity.query(UserActivity.activity == self._event.key, UserActivity.status == UserActivity.ACTIVE)
        for user_activity in user_activities:
            user_activity.status = UserActivity.CANCELLED
            user_activity.put()
        self.get_event().status = Event.CANCELLED
        self.get_event().put()

        eventThrottler = EventThrottler(self.get_event().username)
        eventThrottler.decrement_activity_count()
        return True, "Your activity has been successfully canceled."
コード例 #3
0
 def can_join_flex(self, userId):
 #First check the status
     if self.expires_in() == Event.EXPIRED or self._event.status in Event.NON_EDITABLE_STATUS_CHOICES:
         return False, "Event has already expired/cancelled or closed"
         #Are there any activities with this user and this activity?
     user_info = models.User.get_by_id(long(userId))
     if self._event.username == user_info.username:
         return False, "You cannot join an activity you created."
     user_activity = UserActivity.get_by_user_activity(user_info.key, self._event.key)
     if user_activity:
         return False, "You have already joined this activity."
     #Now check if there are spots remaining
     if self._event.type != Event.EVENT_TYPE_FLEX_INTEREST:
         return False, "This is not a flex event"
     return True, "Success"
コード例 #4
0
 def unjoin(self, user_id):
     (canLeave, message) = self.can_leave()
     if not canLeave:
         return False, message
     user_info = models.User.get_by_id(long(user_id))
     companion_count = self.companion_count() - 1
     user_activity = UserActivity.get_by_user_activity(user_info.key, self._event.key)
     user_activity.status = UserActivity.CANCELLED
     user_activity.put()
     if not self._can_complete(companion_count):
         self._event.status = Event.FORMING
         self._event.put()
         eventThrottler = EventThrottler(self.get_event().username)
         eventThrottler.increment_activity_count()
     return True, "You have successfully left the activity " + self._event.category
コード例 #5
0
 def _handleFeedBack(self, activity):
     activity_user = models.User.get_by_username(activity.username)
     #all users signed up for this activity
     participants_list = UserActivity.query(
         UserActivity.activity == activity.key,
         UserActivity.status == UserActivity.ACTIVE).fetch(
             projection=[UserActivity.user])
     #Ask feedback from participants
     for participant in participants_list:
         user_feedback = UserFeedback()
         user_feedback.activity = activity.key
         user_feedback.user = participant.user
         user_feedback.put()
         #Ask feedback from owner
     user_feedback = UserFeedback()
     user_feedback.activity = activity.key
     user_feedback.user = activity_user.key
     user_feedback.put()
コード例 #6
0
 def _handle_companionship_rating(self, activity):
     #populate default rating information for the owner
     activity_user = models.User.get_by_username(activity.username).key
     participants_list = UserActivity.query(
         UserActivity.activity == activity.key,
         UserActivity.status == UserActivity.ACTIVE).fetch(
             projection=[UserActivity.user])
     for participant in participants_list:
         self._create_default_rating(activity, activity_user,
                                     participant.user)
     #populate for other participants
     for participant in participants_list:
         self._create_default_rating(activity, participant.user,
                                     activity_user)
         for other_participant in filter(
                 lambda user_participant: user_participant.user !=
                 participant.user, participants_list):
             self._create_default_rating(activity, participant.user,
                                         other_participant.user)
コード例 #7
0
 def can_leave(self,user_id=None):
     if self.expires_in() == Event.EXPIRED or self._event.status in Event.NON_EDITABLE_STATUS_CHOICES:
         return False, "You cannot leave an expired/closed/initiated/cancelled interest."
     if user_id is not None:
         user = models.User.get_by_id(long(user_id))
         count = UserActivity.query(UserActivity.activity == self._event.key, UserActivity.user == user.key,
                                    UserActivity.status == UserActivity.ACTIVE).count()
         if count == 0:
             return False,"This is not your activity"
     if self._event.status == Event.FORMED_OPEN:
         #TODO Needs some work here to figure out till what time an event can be cancelled
         if self._event.expiration is not None:
             expiration_time = int(str(self._event.expiration))
             now = datetime.now()
             timezone_offset = now - datetime.utcnow()
             last_cancellation_time = self._event.date_entered + timedelta(minutes=expiration_time) - timedelta(minutes=5) + timezone_offset
             if now > last_cancellation_time:
                 return False, "You cannot leave 5 minutes before activity starts."
     return True, "You can leave."
コード例 #8
0
 def can_join(self, userId):
     if self._event.type == Event.EVENT_TYPE_FLEX_INTEREST:
         return self.can_join_flex(userId)
     #First check the status
     if self.expires_in() == Event.EXPIRED or self._event.status in Event.NON_EDITABLE_STATUS_CHOICES:
         return False, "Event has already expired/cancelled or closed"
     #Are there any activities with this user and this activity?
     user_info = models.User.get_by_id(long(userId))
     if self._event.username == user_info.username:
         return False, "You created this activity."
     user_activity = UserActivity.get_by_user_activity(user_info.key, self._event.key)
     if user_activity:
         return False, "You have already joined this activity."
     #Now check if there are spots remaining
     elif self._event.max_number_of_people_to_join == 'No Limit':
         return True, "Success"
     else:
         max_count = int(self._event.max_number_of_people_to_join.split()[0])
         if self.companion_count() < max_count:
             return True, "Success"
         return False, "This activity is full."
コード例 #9
0
 def get_all_companions(self):
     return UserActivity.query(UserActivity.activity == self._event.key, UserActivity.status == UserActivity.ACTIVE).fetch(projection = [UserActivity.user])
コード例 #10
0
 def companion_count(self):
     companions = UserActivity.query(UserActivity.activity == self._event.key, UserActivity.status == UserActivity.ACTIVE).count()
     logging.info(companions)
     return companions