def send_submission_message(submission, user, subject, template, **kwargs): send_system_message_template( user, subject.format(ec_number=submission.get_ec_number_display()), template, None, submission=submission, **kwargs)
def send_agenda_to_board(request, meeting_pk=None): meeting = get_object_or_404(Meeting, pk=meeting_pk) agenda_pdf = meeting.get_agenda_pdf(request) agenda_filename = '{}-{}-{}.pdf'.format(slugify(meeting.title), timezone.localtime(meeting.start).strftime('%d-%m-%Y'), slugify(_('agenda'))) timetable_pdf = meeting.get_timetable_pdf(request) timetable_filename = '{}-{}-{}.pdf'.format(slugify(meeting.title), timezone.localtime(meeting.start).strftime('%d-%m-%Y'), slugify(_('time slot'))) attachments = ( (agenda_filename, agenda_pdf, 'application/pdf'), (timetable_filename, timetable_pdf, 'application/pdf'), ) subject = _('EC Meeting {}').format( timezone.localtime(meeting.start).strftime('%d.%m.%Y')) reply_to = AdvancedSettings.objects.get().contact_email users = User.objects.filter(meeting_participations__entry__meeting=meeting).distinct() for user in users: timeframe = meeting._get_timeframe_for_user(user) if timeframe is None: continue start, end = timeframe htmlmail = str(render_html(request, \ 'meetings/messages/boardmember_invitation.html', \ {'meeting': meeting, 'start': start, 'end': end, 'recipient': user})) deliver(user.email, subject=subject, message=None, message_html=htmlmail, from_email=settings.DEFAULT_FROM_EMAIL, rfc2822_headers={"Reply-To": reply_to}, attachments=attachments) for user in User.objects.filter(groups__name__in=settings.ECS_MEETING_AGENDA_RECEIVER_GROUPS): start, end = meeting.start, meeting.end htmlmail = str(render_html(request, \ 'meetings/messages/resident_boardmember_invitation.html', \ {'meeting': meeting, 'recipient': user})) deliver(user.email, subject=subject, message=None, message_html=htmlmail, from_email=settings.DEFAULT_FROM_EMAIL, rfc2822_headers={"Reply-To": reply_to}, attachments=attachments) tops_with_primary_investigator = meeting.timetable_entries.filter(submission__invite_primary_investigator_to_meeting=True, submission__current_submission_form__primary_investigator__user__isnull=False, timetable_index__isnull=False) for top in tops_with_primary_investigator: sf = top.submission.current_submission_form for u in {sf.primary_investigator.user, sf.presenter, sf.submitter, sf.sponsor}: send_system_message_template(u, subject, 'meetings/messages/primary_investigator_invitation.txt', {'top': top}, submission=top.submission) meeting.agenda_sent_at = timezone.now() meeting.save() return redirect('ecs.meetings.views.meeting_details', meeting_pk=meeting.pk)
def send_expedited_reviewer_invitations(request, meeting_pk=None): meeting = get_object_or_404(Meeting, pk=meeting_pk) categories = MedicalCategory.objects.filter( submissions__in=meeting.submissions.expedited()) users = User.objects.filter(profile__is_board_member=True, medical_categories__in=categories.values('pk')) start = meeting.deadline_expedited_review for user in users: subject = _('Expedited Review at {}').format( timezone.localtime(start).strftime('%d.%m.%Y')) send_system_message_template(user, subject, 'meetings/messages/expedited_reviewer_invitation.txt', {'start': start}) meeting.expedited_reviewer_invitation_sent_at = timezone.now() meeting.save(update_fields=('expedited_reviewer_invitation_sent_at',)) return redirect('ecs.meetings.views.meeting_details', meeting_pk=meeting.pk)
def pre_perform(self, choice): c = self.workflow.data c.status = choice c.save() if c.status == 'review_ok': if not c.pdf_document: c.render_pdf_document() presenting_parties = c.submission.current_submission_form.get_presenting_parties( ) presenting_parties.send_message( _('External Review'), 'checklists/external_review_publish.txt', { 'checklist': c, 'ABSOLUTE_URL_PREFIX': settings.ABSOLUTE_URL_PREFIX }, submission=c.submission) elif c.status == 'review_fail': send_system_message_template( c.user, _('Query regarding review'), 'checklists/external_review_declined.txt', None, submission=c.submission)
def receive_token(self, *args, **kwargs): c = self.workflow.data token = super().receive_token(*args, **kwargs) token.task.assign(c.user) if c.status == 'new': with sudo(): meeting = Meeting.objects.filter( timetable_entries__submission=c.submission, started=None).order_by('start').first() price = Price.objects.get_review_price() url = reverse('ecs.tasks.views.do_task', kwargs={'task_pk': token.task.pk}) send_system_message_template( c.user, _('Request for review'), 'checklists/external_reviewer_invitation.txt', { 'task': token.task, 'meeting': meeting, 'price': price, 'ABSOLUTE_URL_PREFIX': settings.ABSOLUTE_URL_PREFIX, 'url': url }, submission=c.submission) return token
def xls_export(user_id=None, filters=None): user = User.objects.get(id=user_id) # Use same filters as selected in the HTML view. filterform = AllSubmissionsFilterForm(filters) submissions = filterform.filter_submissions(Submission.objects.all(), user) submissions = submissions.select_related( 'current_submission_form', 'current_submission_form__primary_investigator', 'current_published_vote', 'presenter', 'presenter__profile', ).prefetch_related( 'current_submission_form__investigators', 'current_submission_form__foreignparticipatingcenter_set', 'medical_categories', ).annotate(first_sf_date=Min('forms__created_at')).order_by('ec_number') xls = xlwt.Workbook(encoding="utf-8") sheet = xls.add_sheet(_('Submissions')) sheet.panes_frozen = True sheet.horz_split_pos = 3 header = xlwt.easyxf( 'font: bold on; align: horiz center, vert center, wrap on;') italic = xlwt.easyxf('font: italic on;') def label(f): return str(get_field_info(SubmissionForm, f).label) def inv_label(f): return str(get_field_info(Investigator, f).label) sheet.write_merge(0, 2, 0, 0, _('EC-Number'), header) sheet.write_merge(0, 2, 1, 1, label('project_title'), header) sheet.write_merge(0, 2, 2, 2, label('german_project_title'), header) sheet.write_merge(0, 2, 3, 3, label('eudract_number'), header) sheet.write_merge(0, 1, 4, 5, _('AMG'), header) sheet.write(2, 4, _('Yes') + '/' + _('No'), header) sheet.write(2, 5, _('Type'), header) sheet.write_merge(0, 2, 6, 6, _('MPG'), header) sheet.write_merge(0, 2, 7, 7, _('monocentric') + '/' + _('multicentric'), header) sheet.write_merge(0, 2, 8, 8, _('workflow lane'), header) sheet.write_merge(0, 2, 9, 9, _('remission'), header) sheet.write_merge(0, 2, 10, 10, _('Medical Categories'), header) sheet.write_merge(0, 2, 11, 11, _('Phase'), header) sheet.write_merge(0, 1, 12, 13, _('Vote'), header) sheet.write(2, 12, _('Vote'), header) sheet.write(2, 13, _('valid until'), header) sheet.write_merge(0, 2, 14, 14, _('first acknowledged form'), header) sheet.write_merge(0, 1, 15, 17, _('Presenter'), header) sheet.write(2, 15, _('Organisation'), header) sheet.write(2, 16, _('name'), header) sheet.write(2, 17, _('email'), header) sheet.write_merge(0, 1, 18, 20, _('Submitter'), header) sheet.write(2, 18, label('submitter_organisation'), header) sheet.write(2, 19, _('contact person'), header) sheet.write(2, 20, _('email'), header) sheet.write_merge(0, 1, 21, 23, _('Sponsor'), header) sheet.write(2, 21, label('sponsor_name'), header) sheet.write(2, 22, _('contact person'), header) sheet.write(2, 23, _('email'), header) sheet.write_merge(0, 1, 24, 26, _('invoice recipient'), header) sheet.write(2, 24, label('invoice_name'), header) sheet.write(2, 25, _('contact person'), header) sheet.write(2, 26, _('email'), header) sheet.write_merge(0, 1, 27, 29, _('Primary Investigator'), header) sheet.write(2, 27, inv_label('organisation'), header) sheet.write(2, 28, _('investigator'), header) sheet.write(2, 29, _('email'), header) sheet.write_merge(0, 1, 30, 36, _('participants'), header) sheet.write(2, 30, label('subject_count'), header) sheet.write(2, 31, label('subject_minage'), header) sheet.write(2, 32, label('subject_maxage'), header) sheet.write(2, 33, label('subject_noncompetents'), header) sheet.write(2, 34, label('subject_males'), header) sheet.write(2, 35, label('subject_females'), header) sheet.write(2, 36, label('subject_childbearing'), header) sheet.write_merge(0, 0, 37, 57, _('type of project'), header) sheet.write_merge(1, 2, 37, 37, label('project_type_non_reg_drug'), header) sheet.write_merge(1, 1, 38, 40, label('project_type_reg_drug'), header) sheet.write(2, 38, _('Yes') + '/' + _('No'), header) sheet.write(2, 39, label('project_type_reg_drug_within_indication'), header) sheet.write(2, 40, label('project_type_reg_drug_not_within_indication'), header) sheet.write_merge(1, 2, 41, 41, label('project_type_medical_method'), header) sheet.write_merge(1, 1, 42, 45, label('project_type_medical_device'), header) sheet.write(2, 42, _('Yes') + '/' + _('No'), header) sheet.write(2, 43, label('project_type_medical_device_with_ce'), header) sheet.write(2, 44, label('project_type_medical_device_without_ce'), header) sheet.write(2, 45, label('project_type_medical_device_performance_evaluation'), header) sheet.write_merge(1, 2, 46, 46, label('project_type_basic_research'), header) sheet.write_merge(1, 2, 47, 47, label('project_type_genetic_study'), header) sheet.write_merge(1, 2, 48, 48, label('project_type_misc'), header) sheet.write_merge(1, 2, 49, 49, label('project_type_education_context'), header) sheet.write_merge(1, 2, 50, 50, label('project_type_register'), header) sheet.write_merge(1, 2, 51, 51, label('project_type_biobank'), header) sheet.write_merge(1, 2, 52, 52, label('project_type_retrospective'), header) sheet.write_merge(1, 2, 53, 53, label('project_type_questionnaire'), header) sheet.write_merge(1, 2, 54, 54, label('project_type_psychological_study'), header) sheet.write_merge(1, 2, 55, 55, label('project_type_nursing_study'), header) sheet.write_merge(1, 2, 56, 56, label('project_type_non_interventional_study'), header) sheet.write_merge(1, 2, 57, 57, label('project_type_gender_medicine'), header) # format helpers _b = lambda x: _('Yes') if x else _('No') _d = lambda x: timezone.localtime(x).strftime('%d.%m.%Y') if x else None for i, submission in enumerate(submissions, 3): sf = submission.current_submission_form vote = submission.current_published_vote pi = sf.primary_investigator multicentric = ( sf.investigators.count() + sf.foreignparticipatingcenter_set.count() ) > 1 sheet.write(i, 0, submission.get_ec_number_display()) sheet.write(i, 1, sf.project_title) sheet.write(i, 2, sf.german_project_title) sheet.write(i, 3, sf.eudract_number) sheet.write(i, 4, _b(sf.is_amg)) sheet.write(i, 5, sf.get_submission_type_display() if sf.is_amg else None) sheet.write(i, 6, _b(sf.is_mpg)) sheet.write(i, 7, _('multicentric') if multicentric else _('monocentric')) sheet.write(i, 8, submission.get_workflow_lane_display()) sheet.write(i, 9, _b(submission.remission)) sheet.write(i, 10, ', '.join(sorted( m.name for m in submission.medical_categories.all()))) sheet.write(i, 11, submission.lifecycle_phase) sheet.write(i, 12, vote.result if vote else None) sheet.write(i, 13, _d(vote.valid_until) if vote else None) sheet.write(i, 14, _d(submission.first_sf_date)) sheet.write(i, 15, submission.presenter.profile.organisation) sheet.write(i, 16, str(submission.presenter)) sheet.write(i, 17, submission.presenter.email) sheet.write(i, 18, sf.submitter_organisation) sheet.write(i, 19, sf.submitter_contact.full_name) sheet.write(i, 20, sf.submitter_email) sheet.write(i, 21, sf.sponsor_name) sheet.write(i, 22, sf.sponsor_contact.full_name) sheet.write(i, 23, sf.sponsor_email) if sf.invoice_name: sheet.write(i, 24, sf.invoice_name) sheet.write(i, 25, sf.invoice_contact.full_name) sheet.write(i, 26, sf.invoice_email) else: sheet.write_merge(i, i, 24, 26, _('same as sponsor'), italic) sheet.write(i, 27, pi.organisation) sheet.write(i, 28, pi.contact.full_name) sheet.write(i, 29, pi.email) sheet.write(i, 30, sf.subject_count) sheet.write(i, 31, sf.subject_minage) sheet.write(i, 32, sf.subject_maxage) sheet.write(i, 33, _b(sf.subject_noncompetents)) sheet.write(i, 34, _b(sf.subject_males)) sheet.write(i, 35, _b(sf.subject_females)) sheet.write(i, 36, _b(sf.subject_childbearing)) sheet.write(i, 37, _b(sf.project_type_non_reg_drug)) sheet.write(i, 38, _b(sf.project_type_reg_drug)) sheet.write(i, 39, _b(sf.project_type_reg_drug_within_indication)) sheet.write(i, 40, _b(sf.project_type_reg_drug_not_within_indication)) sheet.write(i, 41, _b(sf.project_type_medical_method)) sheet.write(i, 42, _b(sf.project_type_medical_device)) sheet.write(i, 43, _b(sf.project_type_medical_device_with_ce)) sheet.write(i, 44, _b(sf.project_type_medical_device_without_ce)) sheet.write(i, 45, _b(sf.project_type_medical_device_performance_evaluation)) sheet.write(i, 46, _b(sf.project_type_basic_research)) sheet.write(i, 47, _b(sf.project_type_genetic_study)) sheet.write(i, 48, sf.project_type_misc) sheet.write(i, 49, sf.get_project_type_education_context_display()) sheet.write(i, 50, _b(sf.project_type_register)) sheet.write(i, 51, _b(sf.project_type_biobank)) sheet.write(i, 52, _b(sf.project_type_retrospective)) sheet.write(i, 53, _b(sf.project_type_questionnaire)) sheet.write(i, 54, _b(sf.project_type_psychological_study)) sheet.write(i, 55, _b(sf.project_type_nursing_study)) sheet.write(i, 56, _b(sf.project_type_non_interventional_study)) sheet.write(i, 57, _b(sf.project_type_gender_medicine)) xls_buf = BytesIO() xls.save(xls_buf) xls_data = xls_buf.getvalue() h = hashlib.sha1() h.update(xls_data) cache_file = os.path.join(settings.ECS_DOWNLOAD_CACHE_DIR, '{}.xls'.format(h.hexdigest())) with open(cache_file, 'wb') as f: f.write(xls_data) send_system_message_template(user, _('XLS-Export done'), 'submissions/xls_export_done.txt', {'shasum': h.hexdigest()})
def send_message(self, *args, **kwargs): exclude = kwargs.pop('exclude', []) users = self.get_users().difference(exclude) for u in users: send_system_message_template(u, *args, **kwargs)