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'}, ] }, )
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()
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
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'}, ] }, )
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)
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 :-("
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))
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()
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