def post(self): logger.debug("Posting new task") task_name = self.get_argument("name") protocol_id = int(self.get_argument("protocol_id")) enrollment_id = int(self.get_argument("enrollment_id")) time_rule = json.loads(self.get_argument("time_rule")) enable_notes = self.get_argument("enable_notes", False) timeout = int(self.get_argument("timeout"), 20) enable_warnings = self.get_argument("enable_warnings", True) enable_notes = 1 if enable_notes else 0 enable_warnings = 1 if enable_warnings else 0 all_run_times = [] all_run_dates = [] local_tz = pytz.timezone(time_rule['timezone']) date_conversion = time_rule["run_date"] time_conversion = time_rule["run_times"] for several_run_time in time_conversion: datetime_without_tz = datetime.strptime( str(date_conversion) + " " + str(several_run_time), "%Y-%m-%d %H:%M") datetime_with_tz = local_tz.localize( datetime_without_tz, is_dst=True) # No daylight saving time datetime_in_utc = datetime_with_tz.astimezone(pytz.utc) str_utc_time = datetime_in_utc.strftime('%Y-%m-%d %H:%M %Z') all_run_dates.append(str_utc_time[:10]) all_run_times.append(str_utc_time[11:16]) time_rule["run_date"] = str_utc_time[:10] time_rule["run_times"] = all_run_times auth = authenticate(self, [Permissions.WRITE_TASK, Permissions.WRITE_SURVEY]) if auth["valid"]: owner_id = int(auth['owner_id']) response = None if ProtocolService.is_owned_by(protocol_id, int(auth['owner_id'])): if EnrollmentService.is_owned_by(enrollment_id, owner_id): params = time_rule["params"] run_time_values = time_rule["run_times"] run_times = [] for run_time_value in run_time_values: rtv = run_time_value.split(":") hour = int(rtv[0]) minute = int(rtv[1]) run_times.append( datetime.now(tz=pytz.utc).replace(hour=hour, minute=minute, second=0)) until = datetime.strptime( time_rule["run_date"], "%Y-%m-%d").replace(tzinfo=pytz.utc) run_date = datetime.strptime( time_rule["run_date"], "%Y-%m-%d").replace(tzinfo=pytz.utc) last_date = datetime.strptime(time_rule["run_date"], "%Y-%m-%d") start_date = datetime.strptime(time_rule["run_date"], "%Y-%m-%d") intervalcount = 'no_repeat' every = 0 if time_rule["type"] == 'no_repeat': intervalcount = 'no_repeat' time_rule = NoRepeat(run_date, run_times) elif time_rule["type"] == 'daily': intervalcount = 'daily' every = int(params["every"]) until = datetime.strptime( time_rule['until'], "%Y-%m-%d").replace(tzinfo=pytz.utc) last_date = datetime.strptime(time_rule['until'], "%Y-%m-%d") time_rule = RepeatsDaily(run_date, every, until, run_times) elif time_rule["type"] == 'weekly': intervalcount = 'weekly' every = int(params["every"]) until = datetime.strptime( time_rule['until'], "%Y-%m-%d").replace(tzinfo=pytz.utc) time_rule = RepeatsWeekly(every, params['days'], run_times, run_date, until) elif time_rule["type"] == 'monthly_date': intervalcount = 'monthly_date' every = int(params["every"]) until = datetime.strptime( time_rule['until'], "%Y-%m-%d").replace(tzinfo=pytz.utc) time_rule = RepeatsMonthlyDate(every, params['dates'], until, run_times) elif time_rule["type"] == 'monthly_day': intervalcount = 'monthly_day' every = int(params["every"]) until = datetime.strptime( time_rule['until'], "%Y-%m-%d").replace(tzinfo=pytz.utc) time_rule = RepeatsMonthlyDay(every, params['param1'], params['days'], until, run_times) else: response = { "status": "error", "message": time_rule['type'] + " is not a valid time rule" } self.set_status(400) for daysNo in range((last_date - start_date).days + 1): DataManagement.dataStorage.append(enrollment_id) listParticipants = [] participants = ParticipantService.get_participants_in_enrollment( enrollment_id) for participant in participants: listParticipants.append(participant.id) DataManagement.dataStorage.append(listParticipants) DataManagement.dataStorage.append(start_date) DataManagement.dataStorage.append(run_time_values) DataManagement.dataStorage.append("cig_ecig") DataManagement.dataStorage.append(until) DataManagement.dataStorage.append(intervalcount) DataManagement.dataStorage.append(protocol_id) DataManagement.dataStorage.append("scheduled") DataManagement.get_schedule() start_date = start_date + timedelta(days=every) else: response = { "status": "error", "message": "Enrollment not owned by account" } self.set_status(401) else: response = { "status": "error", "message": "Protocol not owned by account" } self.set_status(401) if response is None: survey = SurveyService.create_survey(owner_id, protocol_id, enrollment_id, enable_notes, timeout, enable_warnings) time_rule_id = TimeRuleService().insert(survey.id, time_rule) TaskService.create_task(task_name, survey.id, time_rule_id) DataManagement.getSurveyid(survey.id) response = {"status": "success"} self.set_status(200) response_json = json.dumps(response) logger.debug(response_json) self.write(response_json) self.flush()
from smsurvey.core.model.model import Model from smsurvey.core.services.owner_service import OwnerService from smsurvey.core.services.protocol_service import ProtocolService from smsurvey.core.services.survey_service import SurveyService from smsurvey.core.services.enrollment_service import EnrollmentService from smsurvey.core.services.task_service import TaskService from smsurvey.schedule.time_rule.time_rule import RepeatsDailyTimeRule from smsurvey.schedule.time_rule.time_rule_service import TimeRuleService print("Loading models") Model.from_database(config.dao) print("Generating and inserting surveys") owner = OwnerService.get("sam", "mhealth") enrollment = EnrollmentService.get_by_owner(owner.id)[0] survey = SurveyService.create_survey(owner.id, ProtocolService.get_all_protocols()[0].id, enrollment.id, False) starting_from = datetime.now() every = 1 until = starting_from + timedelta(days=1) run_at = time(tzinfo=pytz.utc).replace(hour=16, minute=35, second=0, microsecond=0) tr = RepeatsDailyTimeRule(starting_from, every, until, [run_at]) time_rule_id = TimeRuleService().insert(survey.id, tr, str(survey.id) + "1") TaskService.create_task("Demo task", survey.id, time_rule_id) print("Surveys inserted and generated") print("Script finished")