Ejemplo n.º 1
0
def mix_chart(request):
    current_user = request.user
    meals = MealTime.objects.filter(trash=False, active=True, user=current_user)
    fat = []
    proteins = []
    carbohydrates = []
    for meal in meals:
        ts = (meal.timestamp.astimezone(tzone(settings.TIME_ZONE))).strftime("%Y-%m-%d %H:%M")
        fat.append({'x': ts, 'y': meal.fat})
        proteins.append({'x': ts, 'y': meal.proteins})
        carbohydrates.append({'x': ts, 'y': meal.carbohydrates})

    levels = SugarLevel.objects.filter(trash=False, active=True, user=current_user)
    sugar = []
    for level in levels:
        ts = (level.timestamp.astimezone(tzone(settings.TIME_ZONE))).strftime("%Y-%m-%d %H:%M")
        sugar.append({'x': ts, 'y': level.sugar_level})

    return JsonResponse(data={
        'datasets': [
            {'label': 'fat', 'data': fat, 'borderColor': '#CC66FF', 'fill': 0, 'pointBackgroundColor': '#4A235A'},
            {'label': 'carbohydrates', 'data': carbohydrates, 'borderColor': '#99ff00', 'fill': 0, 'pointBackgroundColor': '#186A3B'},
            {'label': 'proteins', 'data': proteins, 'borderColor': '#ffff80', 'fill': 0, 'pointBackgroundColor': '#D4AC0D'},
            {'label': 'Sugar Level', 'data': sugar, 'borderColor': '#F39C12', 'fill': 0, 'pointBackgroundColor': '#7E5109'},
        ]
    },
    )
Ejemplo n.º 2
0
    def clean(self):
        """
        Checks to make sure the dates are valid. If there is an end-date set, it is assumed that the gig is "all day" events,
        so the times are not used. Otherwise the times are used and the enddate is just the same as the start date.
        """
        def _parse(val,format_type):
            x = None
            if val:
                for format in get_format(format_type):
                    try:
                        x = datetime.strptime(val.replace(' ',''), format)
                    except (ValueError, TypeError):
                        continue
            return x

        def _mergetime(hour, minute='', zone=None):
            if minute:
                hour = hour.replace(hour=minute.hour, minute=minute.minute)
            return zone.localize(hour) if zone else hour

        date = _parse(self.cleaned_data.get('call_date'), 'DATE_INPUT_FORMATS')
        if date is None:
            self.add_error('call_date', ValidationError(_('Date is not valid'), code='invalid date'))
            super().clean()
            return

        end_date = _parse(self.cleaned_data.get('end_date',''), 'DATE_INPUT_FORMATS')
        if end_date is None or end_date==date:
            call_time = _parse(self.cleaned_data.get('call_time',None), 'TIME_INPUT_FORMATS')
            set_time = _parse(self.cleaned_data.get('set_time',None), 'TIME_INPUT_FORMATS')
            end_time = _parse(self.cleaned_data.get('end_time',None), 'TIME_INPUT_FORMATS')

            date = _mergetime(date, call_time, tzone(self.fields['timezone'].initial))
            setdate = _mergetime(date, set_time) if set_time else None
            enddate = _mergetime(date, end_time) if end_time else None
        else:
            date=date.replace(tzinfo=tzone(self.fields['timezone'].initial))
            enddate=end_date.replace(tzinfo=tzone(self.fields['timezone'].initial))
            setdate = None

        if date < timezone.now():
            self.add_error('call_date', ValidationError(_('Gig call time must be in the future'), code='invalid date'))
        if setdate and setdate < date:
            self.add_error('set_time', ValidationError(_('Set time must not be earlier than the call time'), code='invalid set time'))
        if enddate:
            if enddate < date:
                if end_date:
                    self.add_error('end_date', ValidationError(_('Gig end must not be earlier than the start'), code='invalid end time'))
                else:
                    self.add_error('end_time', ValidationError(_('Gig end must not be earlier than the call time'), code='invalid end time'))
            elif setdate and enddate < setdate:
                self.add_error('end_time', ValidationError(_('Gig end must not be earlier than the set time'), code='invalid end time'))

        self.cleaned_data['date'] = date
        self.cleaned_data['setdate'] = setdate
        self.cleaned_data['enddate'] = enddate

        super().clean()
Ejemplo n.º 3
0
def make_comment_object(entity):
    key, parent = get_key(entity)
    id = make_id('Comment', key)

    parent_id = find_id('Gig', parent)
    member_id = find_id('Member', key_to_str(entity['member']))

    if member_id is None:
        # member deleted at some point but the plan wasn't - weird
        return None

    tz = find_band_timezone(find_gig_band(parent_id))

    created_date = datetime.datetime.now()
    if 'created_date' in entity:
        if entity['created_date']:
            created_date = entity['created_date']
    created_date = created_date.replace(tzinfo=tzone(tz))

    return """{{
        "model": "gig.gigcomment",
        "pk": {0},
        "fields": {{
            "gig": {1}, 
            "member": {2},
            "text": "{3}",
            "created_date": "{4}"
        }}   
}},\n""".format(id, parent_id, member_id, enc(entity['comment']), created_date)
def download_lambda_metric(function_name,
                           start_time=datetime.now() - timedelta(weeks=1),
                           end_time=datetime.now(),
                           out_file='./metric.json',
                           timezone='Europe/Dublin'):
    """Downloads a given Lambda metric's Duration and ConcurrentExecutions metrics."""
    queries = [{
        'Id': 'm1',
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/Lambda',
                'MetricName': 'Duration',
                'Dimensions': [
                    {
                        'Name': 'FunctionName',
                        'Value': function_name
                    },
                ],
            },
            'Period': 60,
            'Stat': 'Average',
            'Unit': 'Milliseconds'
        }
    }, {
        'Id': 'm2',
        'MetricStat': {
            'Metric': {
                'Namespace': 'AWS/Lambda',
                'MetricName': 'ConcurrentExecutions',
                'Dimensions': [
                    {
                        'Name': 'FunctionName',
                        'Value': function_name
                    },
                ],
            },
            'Period': 60,
            'Stat': 'Average',
            'Unit': 'Count'
        }
    }]
    res = cw_client.get_metric_data(MetricDataQueries=queries,
                                    StartTime=start_time,
                                    EndTime=end_time)

    # JSON can't parse datetime objects that boto3 returns; converting to timestamp strings.
    for i, metric in enumerate(res['MetricDataResults']):
        res['MetricDataResults'][i]['Timestamps'] = list(
            map(
                lambda x: x.astimezone(tzone(timezone)).strftime(
                    '%Y-%m-%dT%H:%M:%S%z'), metric['Timestamps']))

    res = res['MetricDataResults']

    with open(out_file, 'w+') as file:
        file.write(json.dumps(res))
    file.close()

    return res
Ejemplo n.º 5
0
def sugar_chart(request):
    current_user = request.user
    levels = SugarLevel.objects.filter(trash=False, active=True, user=current_user)
    sugar = []
    for level in levels:
        ts = (level.timestamp.astimezone(tzone(settings.TIME_ZONE))).strftime("%Y-%m-%d %H:%M")
        sugar.append({'x': ts, 'y': level.sugar_level})

    return JsonResponse(data={
        'datasets': [
            {'label': 'Sugar Level', 'data': sugar, 'borderColor': '#F39C12', 'fill': 0,
             'pointBackgroundColor': '#7E5109'},
        ]
    },
    )
Ejemplo n.º 6
0
def make_plan_object(entity):
    key, parent = get_key(entity)
    id = make_id('Plan', key)

    parent_id = find_id('Gig', parent)
    member_id = find_id('Member', key_to_str(entity['member']))

    if parent_id is None:
        # gig was deleted but not the plan - weird
        return None

    band_id = find_gig_band(parent_id)

    if member_id is None:
        # member deleted at some point but the plan wasn't - weird
        return None

    assoc_id = find_assoc(band_id, member_id)

    if assoc_id is None:
        # super weird
        return None

    section_id = find_id('Section', entity['section'])

    tz = find_band_timezone(find_gig_band(parent_id))
    mod_date = datetime.datetime.now()
    mod_date = mod_date.replace(tzinfo=tzone(tz))

    return """{{
        "model": "gig.plan",
        "pk": {0},
        "fields": {{
            "gig": {1}, 
            "assoc": {2},
            "status": {3},
            "feedback_value": {4},
            "comment": "{5}",
            "section": {6},
            "plan_section": {7},
            "last_update": "{8}"
        }}   
}},\n""".format(id, parent_id, assoc_id, entity['value'],
                entity.get('feedback_value', None),
                enc(entity.get('comment', ''))[:200], section_id, section_id,
                mod_date)
Ejemplo n.º 7
0
def envoiStats(s_smtp,from_addr,to_addrs,sujet,TIME_ZONE,msg_utils):
    """
    Envoi des stats à une liste interne.
    """

    moment = datetime.now(tzone(TIME_ZONE)).\
        strftime('%a, %d %B %Y %H:%M:%S %z')
    #create message container

    msg =  MIMEMultipart('alternative')
    msg['Subject'] = sujet
    msg['From'] = from_addr
    msg['To'] = to_addrs
    msg['Date'] = moment

    #create the body of the message
    message = u"""
    Veuillez activer l'affichage HTML svp
    en attendant que nous formations correctement en
    mode texte
    """

    message_html = msg_utils

    #record the MIME types
    part1 = MIMEText(message, 'plain')
    part2 = MIMEText(message_html, 'html')

    #attach parts into message container
    msg.attach(part1)
    msg.attach(part2)

    #send
    client = smtplib.SMTP(s_smtp)
    try:
            client.sendmail(from_addr,to_addrs,msg.as_string())
            return 'stats fréquentations mensuelles envoyées'
    except Exception:
        return "Oups :-("
Ejemplo n.º 8
0
def make_gig_object(entity):

    key, parent = get_key(entity)
    id = make_id('Gig', key)

    parent_id = find_id('Band', parent)

    store_gig_band(id, parent_id)

    tz = find_band_timezone(parent_id)

    def parsetime(d):
        if type(d) is datetime.datetime:
            return d, ''
        p_d = None
        datenotes = ''
        if d:
            try:
                p_d = parse(d)
            except ValueError:
                # can't parse it, so call this the notes
                datenotes = d

        return p_d, datenotes

    created_date = datetime.datetime.now()
    if 'created_date' in entity:
        if entity['created_date']:
            created_date = entity['created_date']
    created_date = created_date.replace(tzinfo=tzone(tz))

    # deal with dates. GO2 has date, end date, and times for call, set, and end
    # we want datetimes for date, setdate, and enddate
    e_calltime = entity.get('calltime', None)
    e_settime = entity.get('settime', None)
    e_endtime = entity.get('endtime', None)
    e_date = entity.get('date', None)
    e_enddate = entity.get('enddate', None)

    # print(e_calltime, e_settime, e_endtime, e_date, e_enddate)

    pe_calltime, dn1 = parsetime(e_calltime)
    pe_settime, dn2 = parsetime(e_settime)
    pe_endtime, dn3 = parsetime(e_endtime)

    if pe_settime is None:
        pe_settime = datetime.time(hour=0, minute=0)

    if pe_calltime is None:
        pe_calltime = pe_settime

    if pe_endtime is None:
        pe_endtime = pe_settime

    date = e_date.replace(hour=pe_calltime.hour, minute=pe_calltime.minute)
    setdate = e_date.replace(hour=pe_settime.hour, minute=pe_settime.minute)

    if e_enddate:
        enddate = e_enddate.replace(hour=pe_endtime.hour,
                                    minute=pe_endtime.minute)
    else:
        enddate = e_date.replace(hour=pe_endtime.hour,
                                 minute=pe_endtime.minute)

    datenotes = ' '.join([dn1, dn2, dn3]).strip()

    date = date.replace(tzinfo=tzone(tz))
    setdate = setdate.replace(tzinfo=tzone(tz))
    enddate = enddate.replace(tzinfo=tzone(tz))

    trashed_date, note = parsetime(entity.get('trashed_date', None))
    if not trashed_date:
        trashed_date = created_date
    else:
        trashed_date = trashed_date.replace(tzinfo=tzone(tz))

    enddate = enddate.isoformat()
    date = date.isoformat()
    setdate = setdate.isoformat()
    trashed_date = trashed_date.isoformat()
    created_date = created_date.isoformat()

    return """{{
        "model": "gig.gig",
        "pk": {0},
        "fields": {{
            "band": {1}, 
            "title": "{2}",
            "details": "{3}",
            "created_date": "{4}",
            "last_update": "2021-01-01",
            "date": "{5}",
            "address": "{6}",
            "status": {7},
            "is_archived": {8},
            "is_private": {9},
            "creator": {10},
            "invite_occasionals": {11},
            "was_reminded": {12},
            "hide_from_calendar": {13},
            "default_to_attending": {14},
            "trashed_date": "{15}",
            "contact": {16},
            "setlist": "{17}",
            "setdate": "{18}",
            "enddate": "{19}",
            "dress": "{20}",
            "paid": "{21}",
            "postgig": "{22}",
            "leader": {23},
            "datenotes": "{24}"
        }}
}},\n""".format(
        id,
        parent_id,
        enc(entity['title']),
        enc(entity['details']),
        created_date,
        date,
        enc(entity.get('address', None)),
        entity['status'],
        tf(entity['is_archived']),
        tf(entity.get('is_private', None)),
        None,
        tf(entity.get('invite_occasionals', None)),
        tf(entity.get('was_reminded', None)),
        tf(entity.get('hide_from_calendar', None)),
        tf(entity.get('default_to_attending', False)),
        trashed_date,
        find_id('Member', key_to_str(entity['contact'])),
        enc(entity['setlist']),
        setdate,
        enddate,
        enc(entity.get('dress', None)),
        enc(entity.get('paid', None)),
        enc(entity.get('postgig', None)),
        'null',  # enc(entity['leader'] if 'leader' in entity else None),
        enc(datenotes))
Ejemplo n.º 9
0
class TimeUtil(object):
    '''
    Utility functions used to handle things with time.
    '''

    PST = tzone('US/Pacific')

    @staticmethod
    def get_current_time() -> str:
        '''
        Util method to get the time. Import this object
        and use it so that we don't have to manually configure time.\n
        @author npcompletenate
        '''
        utc_dt = datetime.now(timezone.utc)
        return utc_dt.astimezone(TimeUtil.PST).isoformat()

    @staticmethod
    def get_current_year() -> str:
        '''
        Util method to get the current year.\n
        @author YixuanZhou
        '''
        utc_dt = datetime.now(timezone.utc)
        return utc_dt.astimezone(TimeUtil.PST).isoformat().split('-')[0]

    @staticmethod
    def convert_str_to_datetime(time: str) -> datetime:
        '''
        Util method to read a time and convert it into datetime obejct.\n
        This function should give us back a datetime object so that we can
        work with for time calculations.\n
        Inputs:\n
        time --> the str representation of the time.\n
        Returns:\n
        datetime object that consist of the current time.\n
        @authoer YixuanZhou
        '''
        return dateutil.parser.parse(time)

    @staticmethod
    def naive_to_aware(time: datetime):
        '''
        Util method to convert a naive datetime to an aware datetime (PST).\n
        Inputs:\n
        time --> naive datetime.\n
        Returns:\n
        aware datetime of the passed in time.\n
        @author nouryehia
        '''
        return utc.localize(time).astimezone(TimeUtil.PST)

    @staticmethod
    def get_time_diff(time_a: str, time_b: str) -> str:
        '''
        Util method to calculate time difference.\n
        Inputs:\n
        time_a --> the str representation of the time.\n
        time_b --> the str representation of the time.\n
        Returns:\n
        str representation of the timedelta (a-b), but not in isoformat.\n
        @authoer YixuanZhou
        '''
        d_a = TimeUtil.convert_str_to_datetime(time_a)
        d_b = TimeUtil.convert_str_to_datetime(time_b)
        return (str(d_a - d_b))

    @staticmethod
    def get_time_before(hours: float = 0,
                        mins: float = 0,
                        secs: float = 0) -> str:
        '''
        Util method to get the time given a period of time before.\n
        Inputs:\n
        hours --> Number of hours to go before.\n
        mins --> Number of mins to go before.\n
        secs --> Number of secs to go before.\n
        Returns\n
        Isoformated string time.
        @author YixuanZhou
        '''
        curr = TimeUtil.get_current_time()
        curr_d = TimeUtil.convert_str_to_datetime(curr)
        diff = timedelta(hours=hours, minutes=mins, seconds=secs)
        ret_d = curr_d - diff
        return ret_d.astimezone(TimeUtil.PST).isoformat()

    @staticmethod
    def min_time() -> str:
        '''
        Get the min time of datetime but with timezome being set to PST
        '''
        return datetime.min.astimezone(TimeUtil.PST).isoformat()
Ejemplo n.º 10
0
visit_semaine = Visite.objects.filter(date_arrivee__gte=debut_semaine)
service = ['CNF', 'fablab']
visit_service = {}
for svce in service:
    visit_service[svce] = visit_semaine.filter(service__nom_serv=svce)

usager_total = Usager.objects.count()

# section envoi courriel

to_addrs = '*****@*****.**'
sujet = 'Informations sur les visites à la DACGL: semaine {0}'.\
        format(semaine_courante)

moment = datetime.now(tzone(TIME_ZONE)).\
    strftime('%a, %d %B %Y %H:%M:%S %z')
#create message container

msg = MIMEMultipart('alternative')
msg['Subject'] = sujet
msg['From'] = from_addr
msg['To'] = to_addrs
msg['Date'] = moment

#create the body of the message
message = """
Fréquence des visites à la DACGL pour la semaine courante:\n
Date du jour : {0} \n
 * Total de visites pour tout le bureau: {1}\n
  * Visites au CNF : {2}\n