예제 #1
0
def auto_publish_reports(*args, **kwargs):
    '''
  Publish all reports for this week
  '''
    from datetime import date, timedelta
    from sport.models import SportWeek
    from django.db.models import Count
    from helpers import date_to_week
    today = date.today() - timedelta(
        days=1)  # just to be sure we don't send the next week !
    week, year = date_to_week(today)
    reports = SportWeek.objects.filter(
        year=year, week=week, published=False).order_by('user__username')
    reports = reports.filter(
        user__auto_send=True)  # Auto send must be enabled per user
    for r in reports:

        # Skip empty report
        agg = r.days.aggregate(nb=Count('sessions'))
        if not agg['nb']:
            print 'No active sessions for report %s' % r
            continue

        # Publish
        for m in r.user.memberships.all():
            r.publish(m, 'https://runreport.fr')  # TODO : use a config
        print 'Published %s' % r
예제 #2
0
파일: tasks.py 프로젝트: La0/coach
def auto_publish_reports(*args, **kwargs):
    """
  Publish all reports for this week
  """
    from datetime import date, timedelta
    from sport.models import SportWeek
    from django.db.models import Count
    from helpers import date_to_week

    today = date.today() - timedelta(days=1)  # just to be sure we don't send the next week !
    week, year = date_to_week(today)
    reports = SportWeek.objects.filter(year=year, week=week, published=False).order_by("user__username")
    reports = reports.filter(user__auto_send=True)  # Auto send must be enabled per user
    for r in reports:

        # Skip empty report
        agg = r.days.aggregate(nb=Count("sessions"))
        if not agg["nb"]:
            print "No active sessions for report %s" % r
            continue

        # Publish
        for m in r.user.memberships.all():
            r.publish(m, "https://runreport.fr")  # TODO : use a config
        print "Published %s" % r
예제 #3
0
파일: base.py 프로젝트: La0/coach
  def attach_session(self, user, identity):
    # Chekc field
    fields = ('name', 'date', 'distance', 'sport', 'time')
    for f in fields:
      if f not in identity:
        raise Exception("Missing identity field : %s" % f)

    # Attach Activity to valid session
    week, year = date_to_week(identity['date'])
    sport_week,_ = SportWeek.objects.get_or_create(user=user, year=year, week=week)
    day,_ = SportDay.objects.get_or_create(date=identity['date'], week=sport_week)

    # Search an existing session
    sessions = day.sessions.filter(sport=identity['sport'].get_parent(), track__isnull=True)
    min_ratio = None
    if sessions.count():
      # Sort by closest distance & time
      # using a rationalised diff for distance & time
      for s in sessions:
        ratio_time, ratio_distance = None, None
        if s.time and identity['time']:
          t = identity['time'].total_seconds()
          ratio_time = abs(s.time.total_seconds() - t) / t
        if s.distance and identity['distance']:
          ratio_distance = abs(s.distance - identity['distance']) / identity['distance']

        # Sum ratios with compensation for empty values
        ratio = (ratio_time or 0) + (ratio_distance or 0)
        if ratio_time is None or ratio_distance is None:
          ratio *= 2

        # Compare ratio to find best session
        if min_ratio is None or ratio < min_ratio:
          min_ratio = ratio
          self.session = s

        # Update performances & name
        keys = ('name', 'time', 'distance', 'elevation_gain', 'elevation_loss')
        for key in keys:
          identity_value = identity.get(key)
          if identity_value and not getattr(self.session, key):
            setattr(self.session, key, identity_value)
            self.session.save()
    else:
      # Create new session
      data = {
        'sport' : identity['sport'].get_parent(),
        'day' : day,
        'time' : identity['time'],
        'distance' : identity['distance'],
        'name' : identity['name'],
        'elevation_gain' : identity['elevation_gain'],
        'elevation_loss' : identity['elevation_loss'],
      }
      self.session = SportSession.objects.create(**data)
예제 #4
0
파일: mixins.py 프로젝트: La0/coach
  def get_object(self):

    # Load day, report and eventual session
    self.day = date(int(self.get_year()), int(self.get_month()), int(self.get_day()))
    week, year = date_to_week(self.day)
    self.week, created = SportWeek.objects.get_or_create(user=self.get_user(), year=year, week=week)
    try:
      self.object = SportDay.objects.get(week=self.week, date=self.day)
    except:
      self.object = SportDay(week=self.week, date=self.day)
    return self.object
예제 #5
0
파일: setup_demos.py 프로젝트: La0/coach
  def build_day(self, user, day):
    # Build new week/day chain
    w,y = date_to_week(day)
    published = day < (self.today - timedelta(days=6)).date()
    week,_ = SportWeek.objects.get_or_create(user=user, week=w, year=y, defaults={'published':published,})
    d,_ = SportDay.objects.get_or_create(week=week, date=day)

    # Build random number of session
    # with a higher chance to get 1 session per day
    for i in range(0, random.choice([1,1,1,1,1,1,1,2,2,3])):
      self.build_session(d)
예제 #6
0
    def attach_session(self, user, identity):
        # Chekc field
        fields = ('name', 'date', 'distance', 'sport', 'time')
        for f in fields:
            if f not in identity:
                raise Exception("Missing identity field : %s" % f)

        # Attach Activity to valid session
        week, year = date_to_week(identity['date'])
        sport_week, _ = SportWeek.objects.get_or_create(user=user,
                                                        year=year,
                                                        week=week)
        day, _ = SportDay.objects.get_or_create(date=identity['date'],
                                                week=sport_week)

        # Search an existing session
        sessions = day.sessions.filter(sport=identity['sport'].get_parent(),
                                       track__isnull=True)
        min_ratio = None
        if sessions.count():
            # Sort by closest distance & time
            # using a rationalised diff for distance & time
            for s in sessions:
                ratio_time, ratio_distance = None, None
                if s.time and identity['time']:
                    t = identity['time'].total_seconds()
                    ratio_time = abs(s.time.total_seconds() - t) / t
                if s.distance and identity['distance']:
                    ratio_distance = abs(s.distance - identity['distance']
                                         ) / identity['distance']

                # Sum ratios with compensation for empty values
                ratio = (ratio_time or 0) + (ratio_distance or 0)
                if ratio_time is None or ratio_distance is None:
                    ratio *= 2

                # Compare ratio to find best session
                if min_ratio is None or ratio < min_ratio:
                    min_ratio = ratio
                    self.session = s

                # Update title
                if identity['name'] and not self.session.name:
                    self.session.name = identity['name']
                    self.session.save()
        else:
            # Create new session
            self.session = SportSession.objects.create(
                sport=identity['sport'].get_parent(),
                day=day,
                time=identity['time'],
                distance=identity['distance'],
                name=identity['name'])
예제 #7
0
파일: plans.py 프로젝트: La0/coach
  def _build_day(self, user, date):
    # Internal used to create week & day hierarchy
    # Used on PSA move too (so date need to be specified)

    # Load week
    w, year = date_to_week(date)
    week,_ = SportWeek.objects.get_or_create(year=year, week=w, user=user)

    # Load day
    day,_ = SportDay.objects.get_or_create(week=week, date=date)

    return day
예제 #8
0
파일: plans.py 프로젝트: paulrsilva/coach
    def _build_day(self, user, date):
        # Internal used to create week & day hierarchy
        # Used on PSA move too (so date need to be specified)

        # Load week
        w, year = date_to_week(date)
        week, _ = SportWeek.objects.get_or_create(year=year, week=w, user=user)

        # Load day
        day, _ = SportDay.objects.get_or_create(week=week, date=date)

        return day
예제 #9
0
파일: models.py 프로젝트: Flogerbe/coach
    def apply(self, application):
        '''
    Apply this plan session to a user
    '''
        if not self.date:
            raise Exception('No date to apply this session')

        # Load week
        w, year = date_to_week(self.date)
        week, _ = SportWeek.objects.get_or_create(year=year,
                                                  week=w,
                                                  user=application.user)

        # Load day
        day, _ = SportDay.objects.get_or_create(week=week, date=self.date)

        # Check a session does not already have this plan session
        try:
            psa = PlanSessionApplied.objects.get(plan_session=self,
                                                 sport_session__day=day)
        except PlanSessionApplied.DoesNotExist:
            psa = None

        if psa:
            # retrieve sport session
            session = psa.sport_session
        else:
            # Load session
            defaults = {
                'name': self.name,
                'distance': self.distance,
                'time': self.time,
            }
            session, _ = SportSession.objects.get_or_create(sport=self.sport,
                                                            day=day,
                                                            type=self.type,
                                                            defaults=defaults)

            # Apply plan session
            PlanSessionApplied.objects.create(plan_session=self,
                                              sport_session=session,
                                              application=application)

        # Copy all comments
        if self.comments:

            # Build conversation if needed
            if not session.comments_private:
                session.build_conversation('private')

            for c in self.comments.messages.all():
                c.copy(session.comments_private)
예제 #10
0
파일: mixins.py 프로젝트: paulrsilva/coach
    def get_object(self):

        # Load day, report and eventual session
        self.day = date(int(self.get_year()), int(self.get_month()),
                        int(self.get_day()))
        week, year = date_to_week(self.day)
        self.week, created = SportWeek.objects.get_or_create(
            user=self.get_user(), year=year, week=week)
        try:
            self.object = SportDay.objects.get(week=self.week, date=self.day)
        except:
            self.object = SportDay(week=self.week, date=self.day)
        return self.object
예제 #11
0
    def build_day(self, user, day):
        # Build new week/day chain
        w, y = date_to_week(day)
        published = day < (self.today - timedelta(days=6)).date()
        week, _ = SportWeek.objects.get_or_create(user=user,
                                                  week=w,
                                                  year=y,
                                                  defaults={
                                                      'published': published,
                                                  })
        d, _ = SportDay.objects.get_or_create(week=week, date=day)

        # Build random number of session
        # with a higher chance to get 1 session per day
        for i in range(0, random.choice([1, 1, 1, 1, 1, 1, 1, 2, 2, 3])):
            self.build_session(d)
예제 #12
0
파일: day.py 프로젝트: paulrsilva/coach
    def get_context_data(self, *args, **kwargs):
        context = super(RunCalendarDay, self).get_context_data(*args, **kwargs)
        context['now'] = datetime.now()
        context['forms'] = self.get_sessions_forms(self.day, self.object)

        # Previous week sunday
        week = self.object.week
        diff = timedelta(days=1)
        context['previous_day'] = week.get_date_start() - diff

        # Next week monday
        context['next_day'] = week.get_date_end() + diff

        # Add previous week, not published
        if self.request.user.is_authenticated():
            try:
                w, y = date_to_week(date.today() - timedelta(days=7))
                context['previous_week'] = SportWeek.objects.get(
                    user=self.request.user, year=y, week=w, published=False)
            except SportWeek.DoesNotExist:
                context['previous_week'] = None

        # Add friends with activities on the same day
        friends = []
        user = self.get_user()
        if user == self.request.user:
            friends = SportSession.objects.filter(
                day__date=self.day, day__week__user__in=user.friends.all())
            friends = friends.prefetch_related('day', 'day__week', 'sport',
                                               'day__week__user', 'track')
            friends = friends.order_by('day__week__user__first_name')
        context['friends_sessions'] = friends

        # Friends short list
        if friends:
            friend_ids = set(
                friends.values_list('day__week__user',
                                    flat=True).order_by('-updated'))
            context['friends_shortlist'] = Athlete.objects.filter(
                pk__in=friend_ids)

        # Check task on week
        check_task(week)

        return context
예제 #13
0
  def apply(self, application):
    '''
    Apply this plan session to a user
    '''
    if not self.date:
      raise Exception('No date to apply this session')

    # Load week
    w, year = date_to_week(self.date)
    week,_ = SportWeek.objects.get_or_create(year=year, week=w, user=application.user)

    # Load day
    day,_ = SportDay.objects.get_or_create(week=week, date=self.date)

    # Check a session does not already have this plan session
    try:
      psa = PlanSessionApplied.objects.get(plan_session=self, sport_session__day=day)
    except PlanSessionApplied.DoesNotExist:
      psa = None

    if psa:
      # retrieve sport session
      session = psa.sport_session
    else:
      # Load session
      defaults = {
          'name' : self.name,
          'distance' : self.distance,
          'time' : self.time,
      }
      session,_ = SportSession.objects.get_or_create(sport=self.sport, day=day, type=self.type, defaults=defaults)

      # Apply plan session
      PlanSessionApplied.objects.create(plan_session=self, sport_session=session, application=application)

    # Copy all comments
    if self.comments:

      # Build conversation if needed
      if not session.comments_private:
        session.build_conversation('private')

      for c in self.comments.messages.all():
        c.copy(session.comments_private)
예제 #14
0
파일: day.py 프로젝트: La0/coach
  def get_context_data(self, *args, **kwargs):
    context = super(RunCalendarDay, self).get_context_data(*args, **kwargs)
    context['now'] = datetime.now()
    context['forms'] = self.get_sessions_forms(self.day, self.object)

    # Previous week sunday
    week = self.object.week
    diff = timedelta(days=1)
    context['previous_day'] = week.get_date_start() - diff

    # Next week monday
    context['next_day'] = week.get_date_end() + diff

    # Add previous week, not published
    if self.request.user.is_authenticated():
      try:
        w, y = date_to_week(date.today() - timedelta(days=7))
        context['previous_week'] = SportWeek.objects.get(user=self.request.user, year=y, week=w, published=False)
      except SportWeek.DoesNotExist:
        context['previous_week'] = None

    # Add friends with activities on the same day
    friends = []
    user = self.get_user()
    if user == self.request.user:
      friends = SportSession.objects.filter(day__date=self.day, day__week__user__in=user.friends.all())
      friends = friends.prefetch_related('day', 'day__week', 'sport', 'day__week__user', 'track')
      friends = friends.order_by('day__week__user__first_name')
    context['friends_sessions'] = friends

    # Friends short list
    if friends:
      friend_ids = set(friends.values_list('day__week__user', flat=True).order_by('-updated'))
      context['friends_shortlist'] = Athlete.objects.filter(pk__in=friend_ids)

    # Check task on week
    check_task(week)

    return context
예제 #15
0
파일: mixins.py 프로젝트: paulrsilva/coach
 def __init__(self):
     self._today = date.today()
     self._week, self._year = date_to_week(date.today())
예제 #16
0
파일: mixins.py 프로젝트: La0/coach
 def __init__(self):
   self._today = date.today()
   self._week, self._year = date_to_week(date.today())