def __init__(self, data=None, **kwargs): if 'request' in kwargs: request = kwargs.pop('request') if data: forms.Form.__init__(self, data, **kwargs) else: forms.Form.__init__(self, **kwargs) #Question forms i = 0 for lang, lang_verbose in languages: form_name = 'question_%s' % lang form_label = 'Question:%s' % lang_verbose if i == 0: self.fields[form_name] = forms.CharField(label=form_label, max_length=160, required=True, widget=SMSInput()) else: self.fields[form_name] = forms.CharField(label=form_label, max_length=160, required=False, widget=SMSInput()) i += 1 #Response forms for lang, lang_verbose in languages: form_name = 'default_response_%s' % lang form_label = 'Default Response:%s' % lang_verbose self.fields[form_name] = forms.CharField(label=form_label, max_length=160, required=False, widget=SMSInput()) # This may seem like a hack, but this allows time for the Contact model # to optionally have groups (i.e., poll doesn't explicitly depend on the rapidsms-auth # app. queryset = Group.objects.order_by('name') if 'request' in kwargs: request = kwargs.pop('request') try: access = Access.objects.get(user=request.user) queryset = access.groups.order_by('name') except Access.DoesNotExist: pass except UnboundLocalError: pass if hasattr(Contact, 'groups'): GROUP_CHOICES = [(-1, _('Without Group'))] GROUP_CHOICES += [ (id, name) for id, name in queryset.values_list('id', 'name') ] # self.fields['groups'] = forms.ModelMultipleChoiceField(queryset=queryset, required=False) self.fields['groups'] = forms.MultipleChoiceField( choices=GROUP_CHOICES, required=False)
class AssignToNewPollForm(ActionForm): """ assigns contacts to poll""" action_label = _('Assign to New poll') poll_name = forms.CharField(label=_('Poll Name'), max_length='100') POLL_TYPES = [('yn', _('Yes/No Question'))] + [ (c['type'], c['label']) for c in Poll.TYPE_CHOICES.values() ] response_type = \ forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES, widget=RadioSelect, label=_("Response type")) poll_type = forms.ChoiceField(choices=POLL_TYPES, label=_("Poll type")) question = forms.CharField(max_length=160, required=True, widget=SMSInput(), label=_("Question")) default_response = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_("Default response")) def perform(self, request, results): if not len(results): return (_('No contacts selected'), 'error') name = self.cleaned_data['poll_name'] poll_type = self.cleaned_data['poll_type'] poll_type = self.cleaned_data['poll_type'] if poll_type == NewPollForm.TYPE_YES_NO: poll_type = Poll.TYPE_TEXT question = self.cleaned_data.get('question').replace('%', u'\u0025') default_response = self.cleaned_data['default_response'] response_type = self.cleaned_data['response_type'] contacts = Contact.objects.filter(pk__in=results) poll = Poll.create_with_bulk(name=name, type=poll_type, question=question, default_response=default_response, contacts=contacts, user=request.user) poll.response_type = response_type if self.cleaned_data['poll_type'] == NewPollForm.TYPE_YES_NO: poll.add_yesno_categories() poll.save() if settings.SITE_ID: poll.sites.add(Site.objects.get_current()) return (_('%(results)d participants added to %(poll)s poll') % { "results": len(results), "poll": poll.name }, 'success')
class MassTextForm(ActionForm): text = forms.CharField(max_length=160, required=True, widget=SMSInput(), label=_("text")) text_luo = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_("text luo")) action_label = 'Send Message' def perform(self, request, results): if results is None or len(results) == 0: return (_('A message must have one or more recipients!'), 'error') if request.user and request.user.has_perm('contact.can_message'): blacklists = Blacklist.objects.values_list('connection') connections = \ Connection.objects.filter(contact__in=results).exclude(pk__in=blacklists).distinct() text = self.cleaned_data.get('text', "") text = text.replace('%', u'\u0025') if not self.cleaned_data['text_luo'] == '': (translation, created) = \ Translation.objects.get_or_create(language='ach', field=self.cleaned_data['text'], value=self.cleaned_data['text_luo']) messages = Message.mass_text(text, connections) contacts = Contact.objects.filter(pk__in=results) MassText.bulk.bulk_insert(send_pre_save=False, user=request.user, text=text, contacts=list(contacts)) masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False, autoclobber=True) masstext = masstexts[0] return ( _('Message successfully sent to %(connections)d numbers') % { "connections": len(connections) }, 'success', ) else: return ( _("You don't have permission to send messages!"), 'error', )
class ReplyTextForm(ActionForm): text = forms.CharField(required=True, widget=SMSInput()) action_label = 'Reply to selected' def perform(self, request, results): if results is None or len(results) == 0: return ('A message must have one or more recipients!', 'error') if request.user and request.user.has_perm('contact.can_message'): text = self.cleaned_data['text'] if isinstance(results[0], Message): connections = results.values_list('connection', flat=True) elif isinstance(results[0], Response): connections = results.values_list('message__connection', flat=True) Message.mass_text( text, Connection.objects.filter(pk__in=connections).distinct(), status='P') return ('%d messages sent successfully' % results.count(), 'success') else: return ("You don't have permission to send messages!", 'error')
class ReplyTextForm(ActionForm): text = forms.CharField(required=True, widget=SMSInput()) action_label = 'Reply to selected' def perform(self, request, results): if results is None or len(results) == 0: return ('A message must have one or more recipients!', 'error') if request.user and request.user.has_perm('contact.can_message'): router = get_router() text = self.cleaned_data['text'] start_sending_mass_messages() for msg in results: outgoing = OutgoingMessage(msg.connection, text) router.handle_outgoing(outgoing, msg) stop_sending_mass_messages() return ( '%d messages sent successfully' % results.count(), 'success', ) else: return ( "You don't have permission to send messages!", 'error', )
class MassTextForm(ActionForm): text = forms.CharField(max_length=160, required=True, widget=SMSInput()) action_label = 'Send Message' def clean_text(self): text = self.cleaned_data['text'] #replace common MS-word characters with SMS-friendly characters for find, replace in [(u'\u201c', '"'), (u'\u201d', '"'), (u'\u201f', '"'), (u'\u2018', "'"), (u'\u2019', "'"), (u'\u201B', "'"), (u'\u2013', "-"), (u'\u2014', "-"), (u'\u2015', "-"), (u'\xa7', "$"), (u'\xa1', "i"), (u'\xa4', ''), (u'\xc4', 'A')]: text = text.replace(find, replace) return text def perform(self, request, results): if results is None or len(results) == 0: return ('A message must have one or more recipients!', 'error') if request.user and request.user.has_perm('contact.can_message'): if type(results[0]).__name__ == 'Reporters': con_ids = \ [r.default_connection.split(',')[1] if len(r.default_connection.split(',')) > 1 else 0 for r in results] connections = list( Connection.objects.filter(pk__in=con_ids).distinct()) contacts = list( Contact.objects.filter( pk__in=results.values_list('id', flat=True))) else: connections = \ list(Connection.objects.filter(contact__pk__in=results.values_list('id', flat=True)).distinct()) contacts = list(results) text = self.cleaned_data.get('text', "") text = text.replace('%', u'\u0025') messages = Message.mass_text(text, connections) MassText.bulk.bulk_insert(send_pre_save=False, user=request.user, text=text, contacts=contacts) masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False, autoclobber=True) masstext = masstexts[0] if settings.SITE_ID: masstext.sites.add(Site.objects.get_current()) return ( 'Message successfully sent to %d numbers' % len(connections), 'success', ) else: return ( "You don't have permission to send messages!", 'error', )
class SchoolMassTextForm(ActionForm): text = forms.CharField(max_length=160, required=True, widget=SMSInput()) action_label = 'Send Message' def clean_text(self): text = self.cleaned_data['text'] #replace common MS-word characters with SMS-friendly characters for find, replace in [(u'\u201c', '"'), (u'\u201d', '"'), (u'\u201f', '"'), (u'\u2018', "'"), (u'\u2019', "'"), (u'\u201B', "'"), (u'\u2013', "-"), (u'\u2014', "-"), (u'\u2015', "-"), (u'\xa7', "$"), (u'\xa1', "i"), (u'\xa4', ''), (u'\xc4', 'A')]: text = text.replace(find, replace) return text def perform(self, request, results): if results is None or len(results) == 0: return ('A message must have one or more recipients!', 'error') if request.user and request.user.has_perm('auth.add_message'): reporters = [] for school in results: for rep in school.emisreporter_set.filter( groups__name__in=['Teachers', 'Head Teachers']): reporters.append(rep) connections = \ list(Connection.objects.filter(contact__in=reporters).distinct()) text = self.cleaned_data.get('text', "") text = text.replace('%', u'\u0025') messages = Message.mass_text(text, connections) MassText.bulk.bulk_insert(send_pre_save=False, user=request.user, text=text, contacts=list(reporters)) masstexts = MassText.bulk.bulk_insert_commit(send_post_save=False, autoclobber=True) masstext = masstexts[0] if settings.SITE_ID: masstext.sites.add(Site.objects.get_current()) return ( 'Message successfully sent to %d numbers' % len(connections), 'success', ) else: return ( "You don't have permission to send messages!", 'error', )
class TemplateMessage(ActionForm): template = forms.CharField(max_length=160, required=True, widget=SMSInput(), help_text="message shd be of form Dear Hon. [insert name]. [insert results ] of people from [insert district] say that lorem ipsum") poll = forms.ModelChoiceField( queryset=Poll.objects.exclude(start_date=None).exclude(categories=None).order_by('-pk')) label = "Send Message" def perform(self, request, results): if request.user: poll = self.cleaned_data['poll'] contacts = Contact.objects.filter(pk__in=results).exclude(connection=None) regex = re.compile(r"(\[[^\[\]]+\])") template = self.cleaned_data['template'] parts = regex.split(template) yesno_category_names = ['yes', 'no'] poll_data = get_poll_data(poll) if poll_data: import datetime key = "templatemsg%s" % str(datetime.datetime.now().isoformat()) temp_msg, _ = MessageAttribute.objects.get_or_create(name=key) for contact in contacts: if contact.reporting_location and poll_data.get(contact.reporting_location.pk, None): d = { 'name': contact.name.split()[-1], 'district': contact.reporting_location.name, 'results': get_summary(contact.reporting_location.pk, poll_data) } message = "" for p in parts: if p.strip().startswith("["): message = message + d[p.replace("[", "").replace("]", "").strip().rsplit()[1]] else: message = message + p message = Message.objects.create(status="P", direction="O", connection=contact.default_connection, text=message) msg_a = MessageDetail.objects.create(message=message, attribute=temp_msg, value='comfirm') return (mark_safe( 'Message is going to be sent to %d contacts .<a href="/comfirmmessages/%s/">Comfirm Sending </a>' % ( len(results), key)), 'success',) else: return ("some thing went wrong", 'error',) else: return ("you need to be logged in ", 'error',)
def __init__(self, data=None, **kwargs): self.request = kwargs.pop('request') if data: forms.Form.__init__(self, data, **kwargs) else: forms.Form.__init__(self, **kwargs) i = 0 for lang, lang_verbose in languages: form_name = 'question_%s' % lang if i == 0: self.fields[form_name] = forms.CharField(label=lang_verbose, max_length=160, required=True, widget=SMSInput()) else: self.fields[form_name] = forms.CharField(label=lang_verbose, max_length=160, required=False, widget=SMSInput()) i += 1
class ForwardMessageForm(forms.Form): recipients = forms.CharField(label="recepient(s)", required=True, help_text="enter numbers commas separated") text = forms.CharField(required=True, widget=SMSInput())
class AssignToNewPollForm(ActionForm): """ assigns contacts to poll""" action_label = 'Assign to New poll' poll_name = forms.CharField(label='Poll Name', max_length='100') POLL_TYPES = [('yn', 'Yes/No Question')] + [ (c['type'], c['label']) for c in Poll.TYPE_CHOICES.values() ] response_type = forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES, widget=RadioSelect) poll_type = forms.ChoiceField(choices=POLL_TYPES) def __init__(self, data=None, **kwargs): self.request = kwargs.pop('request') if data: forms.Form.__init__(self, data, **kwargs) else: forms.Form.__init__(self, **kwargs) i = 0 for lang, lang_verbose in languages: form_name = 'question_%s' % lang if i == 0: self.fields[form_name] = forms.CharField(label=lang_verbose, max_length=160, required=True, widget=SMSInput()) else: self.fields[form_name] = forms.CharField(label=lang_verbose, max_length=160, required=False, widget=SMSInput()) i += 1 default_response = forms.CharField(max_length=160, required=False, widget=SMSInput()) def perform(self, request, results): #TODO: Deal with languages languages = ["fr"] question_fr = self.cleaned_data.get('question_fr', "") question_fr = question_fr.replace('%', u'\u0025') if not self.cleaned_data['question_en'] == '': languages.append('en') (translation, created) = \ Translation.objects.get_or_create(language='en', field=self.cleaned_data['question_fr'], value=self.cleaned_data['question_en']) if not self.cleaned_data['question_ki'] == '': languages.append('ki') (translation, created) = \ Translation.objects.get_or_create(language='ki', field=self.cleaned_data['question_fr'], value=self.cleaned_data['question_ki']) if not len(results): return ('No contacts selected', 'error') name = self.cleaned_data['poll_name'] poll_type = self.cleaned_data['poll_type'] poll_type = self.cleaned_data['poll_type'] if poll_type == NewPollForm.TYPE_YES_NO: poll_type = Poll.TYPE_TEXT # question = self.cleaned_data.get('question').replace('%', u'\u0025') default_response = self.cleaned_data['default_response'] response_type = self.cleaned_data['response_type'] contacts = Contact.objects.filter(pk__in=results) poll = Poll.create_with_bulk(name=name, type=poll_type, question=question_fr, default_response=default_response, contacts=contacts, user=request.user) poll.response_type = response_type if self.cleaned_data['poll_type'] == NewPollForm.TYPE_YES_NO: poll.add_yesno_categories() poll.save() if settings.SITE_ID: poll.sites.add(Site.objects.get_current()) return ('%d participants added to %s poll' % (len(results), poll.name), 'success')
class NewPollForm(forms.Form): # pragma: no cover TYPE_YES_NO = 'yn' type = forms.ChoiceField(required=True, label=_("Type"), choices=((TYPE_YES_NO, _('Yes/No Question')), )) response_type = forms.ChoiceField(choices=Poll.RESPONSE_TYPE_CHOICES, widget=RadioSelect, initial=Poll.RESPONSE_TYPE_ALL, label=_("Response type")) is_urgent = forms.BooleanField(required=False, label=_('Is urgent')) def updateTypes(self): self.fields['type'].widget.choices += [ (choice['type'], choice['label']) for choice in Poll.TYPE_CHOICES.values() ] name = forms.CharField(max_length=32, required=True, label=_('Name')) question_en = forms.CharField(max_length=160, required=True, widget=SMSInput(), label=_('Question en')) question_luo = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_('Question luo')) question_kdj = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_('Question kdj')) default_response_en = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_('Default response en')) default_response_kdj = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_('Default response kdj')) districts = forms.ModelMultipleChoiceField( queryset=Location.objects.filter( type__slug='district').order_by('name'), required=False, label=_('districts')) default_response_luo = forms.CharField(max_length=160, required=False, widget=SMSInput(), label=_('Default response luo')) # This may seem like a hack, but this allows time for the Contact model # to optionally have groups (i.e., poll doesn't explicitly depend on the rapidsms-auth # app. def __init__(self, data=None, **kwargs): queryset = Group.objects.order_by('name') if 'request' in kwargs: request = kwargs.pop('request') if data: forms.Form.__init__(self, data, **kwargs) else: forms.Form.__init__(self, **kwargs) try: access = Access.objects.get(user=request.user) queryset = access.groups.order_by('name') except Access.DoesNotExist: pass except UnboundLocalError: pass if hasattr(Contact, 'groups'): self.fields['groups'] = forms.ModelMultipleChoiceField( queryset=queryset, required=False, label=_('groups')) def clean(self): cleaned_data = self.cleaned_data groups = cleaned_data.get('groups') if cleaned_data.get('question_en', None): cleaned_data['question_en'] = cleaned_data.get( 'question_en').replace('%', u'\u0025') if cleaned_data.get('default_response_en', None): cleaned_data['default_response_en'] = cleaned_data[ 'default_response_en'].replace('%', u'\u0025') if not groups: raise forms.ValidationError( _("You must provide a set of recipients (a group or groups)")) return cleaned_data def clean_default_response_en(self): return self._cleaned_default_response(self.data['default_response_en']) def clean_default_response_luo(self): return self._cleaned_default_response( self.data['default_response_luo']) def clean_default_response_kdj(self): return self._cleaned_default_response( self.cleaned_data['default_response_kdj']) def _cleaned_default_response(self, default_response): return default_response.replace('%', '%%')