Example #1
0
 def clean_stop_datetime(self):
     start = self.cleaned_data.get('start_datetime')
     stop = self.cleaned_data['stop_datetime']
     # Day entry can't stop before the start
     if start and stop and stop <= start:
         raise forms.ValidationError(_("Stop time can't be less or equal to start time"))
     # Day entry can't stop in more than one futur day from the targeted day date
     if stop and stop.date() > Arrow.fromdate(self.daydate).replace(days=1).date():
         raise forms.ValidationError(_("Stop time can't be more than the next day"))
     
     return stop
Example #2
0
def is_icc_registered_site(report_datetime=None, report_date=None, site=None):
    """Returns True if site is an open intervention site or raises.

    Raises if NOT an intervention site or is an NOT intervention
    with an ICC registration form submitted by this report_datetime.
    """

    if report_datetime:
        report_date_utc = Arrow.fromdatetime(report_datetime).date()
    elif report_date:
        report_date_utc = Arrow.fromdate(report_date).date()
    site = site or Site.objects.get_current()
    if is_intervention_site_or_raise(site=site):
        model_cls = django_apps.get_model("inte_prn.integratedcareclinicregistration")
        try:
            model_cls.objects.get(
                site=site,
                date_opened__lte=report_date_utc,
            )
        except ObjectDoesNotExist:
            raise InterventionSiteNotRegistered(
                f"Site's ICC registration not found.  Got `{site.name}`."
            )
    return True
Example #3
0
    def index(self, request, extra_context=None):
        """
        Add some extra index context such as a dataset to graph.
        """
        today = Arrow.fromdatetime(now())
        last_year = today.replace(months=-11)

        site_dataset = OrderedDict()

        sites = []

        if request.user.is_superuser:
            sites = Site.objects.annotate(video_count=Count('camera__video'))
        else:
            sites = Site.objects.annotate(
                video_count=Count('camera__video')).filter(id__lte=2).exclude(
                    pk=17)

        gf = GraphForm(request.GET)

        startd = last_year
        endd = today

        if gf.is_valid():
            startd = Arrow.fromdate(gf.cleaned_data['start_date'])
            endd = Arrow.fromdate(gf.cleaned_data['end_date'])

        difference = (endd - startd).days

        period = 'month'

        if difference < 31:
            period = 'day'
        elif difference < (30 * 6):
            period = 'week'
        else:
            period = 'month'

        # For every site, aggregate the average number of returning penguins
        # across the entire month. These calculations are the average over
        # the median number of penguins observed each day.

        site_dataset['Total Penguins'] = []
        for site in sites:
            site_dataset[site.name] = []
            for start, end in Arrow.span_range(period, startd, endd):
                average = site.penguincount_set.filter(
                    date__gte=start.date(), date__lte=end.date()).aggregate(
                        penguins=Avg('total_penguins'))
                site_dataset[site.name].append({
                    'date':
                    start.date(),
                    'value':
                    "%0.2f" % average['penguins'] if
                    (average['penguins'] > 0) else 0.0
                })
                for item in site_dataset['Total Penguins']:
                    if item['date'] == start.date():
                        item['value'] = "%0.2f" % (
                            float(item['value']) +
                            (average['penguins'] if
                             (average['penguins'] > 0) else 0.0))
                        break
                else:
                    site_dataset['Total Penguins'].append({
                        'date':
                        start.date(),
                        'value':
                        "%0.2f" % average['penguins'] if
                        (average['penguins'] > 0) else 0.0
                    })

        context = {
            'sites': sites,
            'site_dataset': site_dataset,
            'title': _("Penguin island sites"),
            'gform': gf,
        }
        context.update(extra_context or {})
        return super(PenguinSite, self).index(request, context)
Example #4
0
def arrow_parse(t):
    return Arrow.fromdate(parse(t))
Example #5
0
    def span(self, frame):
        now = self._gen_now()
        now_date = self._get_day_start()

        this_n_days = self._get_n_unit(frame, 'this', 'days')
        this_n_weeks = self._get_n_unit(frame, 'this', 'weeks')
        this_n_months = self._get_n_unit(frame, 'this', 'months')
        this_n_years = self._get_n_unit(frame, 'this', 'years')
        previous_n_days = self._get_n_unit(frame, 'previous', 'days')
        previous_n_weeks = self._get_n_unit(frame, 'previous', 'weeks')
        previous_n_months = self._get_n_unit(frame, 'previous', 'months')
        previous_n_years = self._get_n_unit(frame, 'previous', 'years')

        if frame == 'today' or frame == 'this_day':
            return self.span('this_1_days')
        elif frame == 'this_week':
            start = self._get_week_start()
            return start, now
        elif frame == 'this_month':
            start = self._get_month_start()
            return start, now
        elif frame == 'this_year':
            start = now_date.replace(month=1, day=1)
            return start, now
        elif len(this_n_days) == 1:
            day = int(this_n_days[0])
            start = now_date - datetime.timedelta(days=day - 1)
            return start, now
        elif len(this_n_weeks) == 1:
            week = int(this_n_weeks[0])
            start = self._get_week_start() - datetime.timedelta(weeks=week - 1)
            return start, now
        elif len(this_n_months) == 1:
            s = self._get_month_start()
            ar = Arrow.fromdate(s, s.tzinfo)
            start = ar.replace(months=-(int(this_n_months[0]) - 1)).datetime
            return start, now
        elif len(this_n_years) == 1:
            years = self._get_month_start().year - (int(this_n_years[0]) - 1)
            start = self._get_month_start().replace(month=1, year=years)
            return start, now
        elif frame == 'yesterday' or frame == 'previous_day':
            return self.span('previous_1_days')
        elif frame == 'previous_week':
            return self.span('previous_1_weeks')
        elif frame == 'previous_month':
            return self.span('previous_1_months')
        elif frame == 'previous_year':
            return self.span('previous_1_years')
        elif len(previous_n_days) == 1:
            days = previous_n_days[0]
            start = now_date - datetime.timedelta(days=days)
            end = now_date - datetime.timedelta(seconds=1)
            return start, end
        elif len(previous_n_weeks) == 1:
            weeks = previous_n_weeks[0]
            start = self._get_week_start() - datetime.timedelta(weeks=weeks)
            end = self._get_week_start() - datetime.timedelta(seconds=1)
            return start, end
        elif len(previous_n_months) == 1:
            s = self._get_month_start()
            ar = Arrow.fromdate(s, s.tzinfo)
            start = ar.replace(months=-previous_n_months[0]).datetime
            end = s - datetime.timedelta(seconds=1)
            return start, end
        elif len(previous_n_years) == 1:
            years = self._get_month_start().year - previous_n_years[0]
            start = self._get_month_start().replace(year=years, month=1)
            end = self._get_month_start().replace(month=1) - datetime.timedelta(seconds=1)
            return start, end
Example #6
0
 def _get_week_start(self):
     s = self.day_start
     ar = Arrow.fromdate(s, s.tzinfo)
     return ar.floor('week').datetime