Exemple #1
0
    def handle(self, message):
        entry = ScriptProgress.objects.filter(
            script__slug__startswith='hotline_script',
            connection=message.connection)
        text = (message.text).lower()

        if (not entry.exists()):
            matches = difflib.get_close_matches(
                text, settings.REPORT_KEYWORDS.keys(), 1)

            if not matches:
                return False

            keyword = matches[0]
            language = settings.REPORT_KEYWORDS[keyword]
            slug_name = 'hotline_script_%s' % language

            ScriptProgress.objects.create(
                script=Script.objects.get(slug=slug_name),
                connection=message.connection)
            report = IGReport.objects.create(connection=message.connection,
                                             keyword=message.text)
            contact = Contact(name=message.connection.identity,
                              language=language)
            contact.save()
            report.connection.contact = contact
            report.connection.save()

            return True

        return False
 def testSaveSameContactTwice(self):
     NAME = "newuser"
     PHONE = "+233123"
     contact = Contact(name=NAME)
     form = CommoditiesContactForm({
         'name': NAME,
         'phone': PHONE
     },
                                   instance=contact)
     self.assertTrue(form.is_valid())
     # this time around, the form should NOT throw an error on re-registration
     contact.save()
     contact.set_default_connection_identity(PHONE,
                                             settings.DEFAULT_BACKEND)
     form = CommoditiesContactForm({
         'name': NAME,
         'phone': PHONE
     },
                                   instance=contact)
     self.assertTrue(form.is_valid())
     # this time around, the form should throw an error on duplicate registration
     NEWNAME = "newname"
     new_contact = Contact(name=NEWNAME)
     form = CommoditiesContactForm({
         'name': NEWNAME,
         'phone': PHONE
     },
                                   instance=new_contact)
     self.assertFalse(form.is_valid())
Exemple #3
0
    def handle (self, message):
        entry = ScriptProgress.objects.filter(script__slug__startswith='hotline_script', connection=message.connection)
        text = (message.text).lower()
        
        if (not entry.exists()):
            matches = difflib.get_close_matches(text, settings.REPORT_KEYWORDS.keys(), 1)

            if not matches:
                send_default = getattr(settings, 'SEND_DEFAULT_RESPONSE', True)
                if not send_default:
                    return True
                
                return False
            
            keyword = matches[0]
            language = settings.REPORT_KEYWORDS[keyword]
            slug_name = 'hotline_script_%s' % language
            
            ScriptProgress.objects.create(script=Script.objects.get(slug=slug_name), connection=message.connection)
            report = Report.objects.create(connection=message.connection, keyword=message.text)
            contact = Contact(name=message.connection.identity, language=language)
            contact.save()
            report.connection.contact = contact
            report.connection.save()
            
            return True

        return False
Exemple #4
0
    def _save_contact(self, data):
        """Save contact to database"""

        # Create connection, or if this is a re-register, just use (one
        # of) the old one(s).
        old_connections = self.connections.filter(contact__isnull=True)
        if len(old_connections) > 0:
            conn = old_connections[0]
        else:
            gsm_backend = Backend.objects.get(name='gsm')
            #gsm_backend = Backend.objects.get(name='message_tester')
            conn = Connection(backend=gsm_backend, identity=data['phone_no'])

        # Create contact
        contact = Contact(name=data['name'],
                          language=data['lang'],
                          is_active=False,
                          only_important=data['only_important'])
        contact.save()
        contact.categories = data['categories']
        contact.save()
        conn.contact = contact
        conn.save()

        return contact
Exemple #5
0
def registration(req, pk=None, template="registration/dashboard.html"):
    contact = None
    connection = None
    bulk_form = None

    if pk is not None:
        contact = get_object_or_404(Contact, pk=pk)
        connection = get_object_or_404(Connection, contact__name=contact.name)

    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            contact.delete()
            return HttpResponseRedirect(reverse(registration))

        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,\
                    contact=contact)
                connection.save()

            return HttpResponseRedirect(reverse(registration))
        else:
            contact_form = ContactForm(instance=contact, data=req.POST)
            connection_form = ConnectionForm(req.POST, instance=connection)

            if contact_form.is_valid() and connection_form.is_valid():
                contact = contact_form.save()
                connection = connection_form.save(commit=False)
                connection.contact = contact
                connection.save()
                return HttpResponseRedirect(reverse(registration))

    else:
        contact_form = ContactForm(instance=contact)
        bulk_form = BulkRegistrationForm()
        connection_form = ConnectionForm(instance=connection)

    return render_to_response(
        template, {
            "contacts_table": ContactTable(Contact.objects.all(), request=req),
            "contact_form": contact_form,
            "connection_form": connection_form,
            "bulk_form": bulk_form,
            "contact": contact
        },
        context_instance=RequestContext(req))
 def get_or_create_contact(self):
     if self.contact is not None:
         return self.contact
     contact = Contact(name=self.user.username)
     contact.save()
     self.contact = contact
     self.save()
     return self.contact
 def get_or_create_contact(self):
     if self.contact is not None:
         return self.contact
     contact = Contact(name=self.user.username)
     contact.save()
     self.contact = contact
     self.save()
     return self.contact
Exemple #8
0
    def handle(self, text):

        tokens = self.check_message_valid_and_clean(text)

        if not tokens:
            return
        clinic_code = LocationCode(tokens[0])
        name = tokens[2]
        pin = tokens[4]
        worker_type = clinic_code.get_worker_type()
        location_type = clinic_code.get_location_type()

        if is_already_valid_connection_type(self.msg.connection, worker_type):
            # refuse re-registration if they're still active and eligible
            self.respond(self.ALREADY_REGISTERED,
                         name=self.msg.connection.contact.name,
                         location=self.msg.connection.contact.location)
            return False

        try:
            location = Location.objects.get(slug__iexact=clinic_code.slug,
                                            type__slug__in=location_type)
            if self.msg.connection.contact is not None \
               and self.msg.connection.contact.is_active:
                # this means they were already registered and active, but not yet
                # receiving results.
                clinic = get_clinic_or_default(self.msg.connection.contact)
                if clinic != location:
                    self.respond(self.ALREADY_REGISTERED,
                                 name=self.msg.connection.contact.name,
                                 location=clinic)
                    return True
                else:
                    contact = self.msg.contact
            else:
                contact = Contact(location=location)
                clinic = get_clinic_or_default(contact)
            contact.name = name
            contact.pin = pin
            contact.save()
            contact.types.add(worker_type)

            self.msg.connection.contact = contact
            self.msg.connection.save()

            self.respond(
                "Hi %(name)s, thanks for registering for "
                "Results160 from %(location)s. "
                "Your PIN is %(pin)s. "
                "Reply with keyword 'HELP' if this is "
                "incorrect",
                name=contact.name,
                location=clinic.name,
                pin=pin)
        except Location.DoesNotExist:
            self.respond(
                "Sorry, I don't know about a location with code %(code)s. Please check your code and try again.",
                code=clinic_code)
Exemple #9
0
def registration(req, pk=None):
    contact = None

    if pk is not None:
        contact = get_object_or_404(
            Contact, pk=pk)

    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            contact.delete()
            return HttpResponseRedirect(
                reverse(registration))

        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,
                                        contact=contact)
                connection.save()

            return HttpResponseRedirect(
                reverse(registration))
        else:
            contact_form = ContactForm(
                instance=contact,
                data=req.POST)

            if contact_form.is_valid():
                contact = contact_form.save()
                return HttpResponseRedirect(
                    reverse(registration))

    else:
        contact_form = ContactForm(
            instance=contact)
        bulk_form = BulkRegistrationForm()

    return render_to_response(
        "registration/dashboard.html", {
            "contacts_table": ContactTable(Contact.objects.all(), request=req),
            "contact_form": contact_form,
            "bulk_form": bulk_form,
            "contact": contact
        }, context_instance=RequestContext(req)
    )
Exemple #10
0
    def handle(self, text):

        tokens = self.check_message_valid_and_clean(text)
        
        if not tokens:
            return
        clinic_code = LocationCode(tokens[0])
        name = tokens[2]
        pin = tokens[4]
        worker_type = clinic_code.get_worker_type()
        location_type = clinic_code.get_location_type()
        
        if is_already_valid_connection_type(self.msg.connection, worker_type):
            # refuse re-registration if they're still active and eligible
            self.respond(self.ALREADY_REGISTERED, 
                         name=self.msg.connection.contact.name,
                         location=self.msg.connection.contact.location)
            return False
        
        try:
            location = Location.objects.get(slug__iexact=clinic_code.slug,
                                            type__slug__in=location_type)
            if self.msg.connection.contact is not None \
               and self.msg.connection.contact.is_active:
                # this means they were already registered and active, but not yet 
                # receiving results.
                clinic = get_clinic_or_default(self.msg.connection.contact) 
                if clinic != location:
                    self.respond(self.ALREADY_REGISTERED,
                                 name=self.msg.connection.contact.name,
                                 location=clinic)
                    return True
                else: 
                    contact = self.msg.contact
            else:
                contact = Contact(location=location)
                clinic = get_clinic_or_default(contact)
            contact.name = name
            contact.pin = pin
            contact.save()
            contact.types.add(worker_type)
            
            self.msg.connection.contact = contact
            self.msg.connection.save()
            
            self.respond("Hi %(name)s, thanks for registering for "
                         "Results160 from %(location)s. "
                         "Your PIN is %(pin)s. "
                         "Reply with keyword 'HELP' if this is "
                         "incorrect", name=contact.name, location=clinic.name,
                         pin=pin)
        except Location.DoesNotExist:
            self.respond("Sorry, I don't know about a location with code %(code)s. Please check your code and try again.",
                         code=clinic_code)
Exemple #11
0
 def testSaveSameContactTwice(self):
     NAME = "newuser"
     PHONE = "+233123"
     contact = Contact(name=NAME)
     form = CommoditiesContactForm({'name':NAME, 'phone':PHONE}, instance=contact)
     self.assertTrue(form.is_valid())
     # this time around, the form should NOT throw an error on re-registration
     contact.save()
     contact.set_default_connection_identity(PHONE, settings.DEFAULT_BACKEND)
     form = CommoditiesContactForm({'name':NAME, 'phone':PHONE}, instance=contact)
     self.assertTrue(form.is_valid())
     # this time around, the form should throw an error on duplicate registration
     NEWNAME = "newname"
     new_contact = Contact(name=NEWNAME)
     form = CommoditiesContactForm({'name':NEWNAME, 'phone':PHONE}, instance=new_contact)
     self.assertFalse(form.is_valid())
Exemple #12
0
 def setUp(self):
     # Create some patients to correspond to the test messages
     self.patient = None
     for p in self.patients:
         contact = Contact(name=p["subject_number"])
         contact.save()
         patient = Patient(subject_number=p["subject_number"], contact=contact)
         patient.save()
         if not self.patient:
             self.patient = patient
     for testmsg in self.testmsgs:
         patient = Patient.objects.get(subject_number=testmsg["subject_number"])
         self.assertTrue(patient is not None)
         patient.wisepill_msisdn = testmsg["msisdn"]
         patient.save()
         testmsg["patient"] = patient
         self.assertEquals(patient.wisepill_msisdn, testmsg["msisdn"])
Exemple #13
0
 def setUp(self):
     # Create some patients to correspond to the test messages
     self.patient = None
     for p in self.patients:
         contact = Contact(name=p['subject_number'])
         contact.save()
         patient = Patient(subject_number=p['subject_number'],
                           contact=contact)
         patient.save()
         if not self.patient:
             self.patient = patient
     for testmsg in self.testmsgs:
         patient = Patient.objects.get(subject_number=testmsg['subject_number'])
         self.assertTrue(patient is not None)
         patient.wisepill_msisdn = testmsg['msisdn']
         patient.save()
         testmsg['patient'] = patient
         self.assertEquals(patient.wisepill_msisdn,testmsg['msisdn'])
def send_bulk_message_from_csv(path, text='coffee'):
    backend_name = "TLS-TT"
    file = open(path)
    for line in file:
        line_list = line.split(',')
        name = line_list[0].strip()
        identity = line_list[1].strip()        
#        if Connection.objects.filter(identity=identity).count() == 0:
        contact = Contact(name=name)
        contact.save()
        # TODO deal with errors!
        backend = Backend.objects.get(name=backend_name)
        connection = Connection(backend=backend, identity=identity,\
            contact=contact)
        connection.save()
#       else:
#            connection = Connection.objects.get(identity=identity)
        post = {"connection_id": unicode(connection.id), "text": text}
        call_router("messaging", "send_message", **post)
Exemple #15
0
def contact(request, pk=None):
    if pk:
        contact = get_object_or_404(Contact, pk=pk)
    else:
        contact = Contact()
    contact_form = ContactForm(instance=contact)
    connection_formset = ConnectionFormSet(instance=contact)
    if request.method == 'POST':
        data = {}
        for key in request.POST:
            val = request.POST[key]
            if isinstance(val, basestring):
                data[key] = val
            else:
                try:
                    data[key] = val[0]
                except (IndexError, TypeError):
                    data[key] = val
        # print repr(data)
        del data
        if pk:
            if request.POST["submit"] == "Delete Contact":
                contact.delete()
                messages.add_message(request, messages.INFO, "Deleted contact")
                return HttpResponseRedirect(reverse(registration))
            contact_form = ContactForm(request.POST, instance=contact)
        else:
            contact_form = ContactForm(request.POST)
        if contact_form.is_valid():
            contact = contact_form.save(commit=False)
            connection_formset = ConnectionFormSet(request.POST,
                                                   instance=contact)
            if connection_formset.is_valid():
                contact.save()
                connection_formset.save()
                messages.add_message(request, messages.INFO, "Added contact")
                return HttpResponseRedirect(reverse(registration))
    return render(
        request, 'registration/contact_form.html', {
            "contact": contact,
            "contact_form": contact_form,
            "connection_formset": connection_formset,
        })
Exemple #16
0
def contact(request, pk=None):
    if pk:
        contact = get_object_or_404(Contact, pk=pk)
    else:
        contact = Contact()
    contact_form = ContactForm(instance=contact)
    connection_formset = ConnectionFormSet(instance=contact)
    if request.method == 'POST':
        data = {}
        for key in request.POST:
            val = request.POST[key]
            if isinstance(val, basestring):
                data[key] = val
            else:
                try:
                    data[key] = val[0]
                except (IndexError, TypeError):
                    data[key] = val
        # print repr(data)
        del data
        if pk:
            if request.POST["submit"] == "Delete Contact":
                contact.delete()
                messages.add_message(request, messages.INFO, "Deleted contact")
                return HttpResponseRedirect(reverse(registration))
            contact_form = ContactForm(request.POST, instance=contact)
        else:
            contact_form = ContactForm(request.POST)
        if contact_form.is_valid():
            contact = contact_form.save(commit=False)
            connection_formset = ConnectionFormSet(request.POST,
                                                   instance=contact)
            if connection_formset.is_valid():
                contact.save()
                connection_formset.save()
                messages.add_message(request, messages.INFO, "Added contact")
                return HttpResponseRedirect(reverse(registration))
    return render(request, 'registration/contact_form.html', {
        "contact": contact,
        "contact_form": contact_form,
        "connection_formset": connection_formset,
    })
    def _save_contact (self, data):
        """Save contact to database"""

        # Create connection, or if this is a re-register, just use (one
        # of) the old one(s).
        old_connections = self.connections.filter(contact__isnull=True)
        if len(old_connections) > 0:
            conn = old_connections[0]
        else:
            gsm_backend = Backend.objects.get(name='gsm')
            #gsm_backend = Backend.objects.get(name='message_tester')
            conn = Connection(backend=gsm_backend, identity=data['phone_no'])

        # Create contact
        contact = Contact(name=data['name'], language=data['lang'],
            is_active=False, only_important=data['only_important'])
        contact.save()
        contact.categories = data['categories']
        contact.save()
        conn.contact = contact
        conn.save()

        return contact
Exemple #18
0
def register_user(request, template="malawi/register-user.html"):
    context = dict()
    context['facilities'] = SupplyPoint.objects.filter(type__code="hf").order_by('code')
    context['backends'] = Backend.objects.all()
    context['dialing_code'] = settings.COUNTRY_DIALLING_CODE # [sic]
    if request.method != 'POST':
        return render_to_response(template, context, context_instance=RequestContext(request))

    id = request.POST.get("id", None)
    facility = request.POST.get("facility", None)
    name = request.POST.get("name", None)
    number = request.POST.get("number", None)
    backend = request.POST.get("backend", None)

    if not (id and facility and name and number and backend):
        messages.error(request, "All fields must be filled in.")
        return render_to_response(template, context, context_instance=RequestContext(request))
    hsa_id = None
    try:
        hsa_id = format_id(facility, id)
    except IdFormatException:
        messages.error(request, "HSA ID must be a number between 0 and 99.")
        return render_to_response(template, context, context_instance=RequestContext(request))

    try:
        parent = SupplyPoint.objects.get(code=facility)
    except SupplyPoint.DoesNotExist:
        messages.error(request, "No facility with that ID.")
        return render_to_response(template, context, context_instance=RequestContext(request))

    if Location.objects.filter(code=hsa_id).exists():
        messages.error(request, "HSA with that code already exists.")
        return render_to_response(template, context, context_instance=RequestContext(request))

    try:
        number = int(number)
    except ValueError:
        messages.error(request, "Phone number must contain only numbers.")
        return render_to_response(template, context, context_instance=RequestContext(request))

    hsa_loc = Location.objects.create(name=name, type=config.hsa_location_type(),
                                          code=hsa_id, parent=parent.location)
    sp = SupplyPoint.objects.create(name=name, code=hsa_id, type=config.hsa_supply_point_type(),
                                        location=hsa_loc, supplied_by=parent, active=True)
    sp.save()
    contact = Contact()
    contact.name = name
    contact.supply_point = sp
    contact.role = ContactRole.objects.get(code=config.Roles.HSA)
    contact.is_active = True
    contact.save()

    connection = Connection()
    connection.backend = Backend.objects.get(pk=int(backend))
    connection.identity = "+%s%s" % (settings.COUNTRY_DIALLING_CODE, number) #TODO: Check validity of numbers
    connection.contact = contact
    connection.save()

    messages.success(request, "HSA added!")

    return render_to_response(template, context, context_instance=RequestContext(request))
Exemple #19
0
def registration(req, pk=None):
    contact = None
    sellerSummary = None

    if pk is not None:
        contact = get_object_or_404(
            Contact, pk=pk)

    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            contact.delete()
            return HttpResponseRedirect(
                reverse(registration))

        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,\
                    contact=contact)
                connection.save()

            return HttpResponseRedirect(
                reverse(registration))
        else:
            contact_form = ContactForm(
                instance=contact,
                data=req.POST)

            if contact_form.is_valid():
                contact = contact_form.save()
                return HttpResponseRedirect(
                    reverse(registration))

    else:
        contact_form = ContactForm(
            instance=contact)
            #Not allowing user to add contacts through the UI for now
            #If we eventually do, the line below sets the new contacts'
            #organization to that of the logged in user
            #################
            #instance=Contact(organization=req.user.get_profile().organization))
        seller_summary = getSellerSummary(contact)
        bulk_form = BulkRegistrationForm()

    if req.user.is_staff:
        ctable = ContactTable(Contact.objects.exclude(alias='nobody'), request=req)
        org = None
    else:
        ctable = ContactTable(Contact.objects.filter(organization=req.user.get_profile().organization), request=req)
        org = req.user.get_profile().organization

    return render_to_response(
        "registration/dashboard.html", {
            "organization": org,
            "contacts_table": ctable,
            "contact_form": contact_form,
            "bulk_form": bulk_form,
            "contact": contact,
            "seller_summary": seller_summary
        }, context_instance=RequestContext(req)
    )
Exemple #20
0
def populate_user(row):
    for k, v in row.items():
        if v == '':
            del row[k]

    NON_REQUIRED_FIELDS = ['email', 'supervisor', 'phone']

    for k, v in row.iteritems():
        if v is None and k not in NON_REQUIRED_FIELDS:
            print '%s is required' % k
            return

    try:
        User.objects.get(username=row['username'])
        print 'user %s already exists' % row['username']
        return
    except User.DoesNotExist:
        pass

    ALLOWED_STATES = ('fct', 'nasawara', 'national')
    if not row['state'] in ALLOWED_STATES:
        print 'state must be one of: %s' % ', '.join(ALLOWED_STATES)
        return

    ALLOWED_PROGRAMS = ('pbf', 'fadama', 'both')
    if not row['program'] in ALLOWED_PROGRAMS:
        print 'program must be one of: %s' % ', '.join(ALLOWED_PROGRAMS)
        return

    PROGRAM_PERMS = {
        'pbf': 'pbf_view',
        'fadama': 'fadama_view',
    }
    perms = []
    if row['program'] == 'both':
        perms.extend(PROGRAM_PERMS.values())
    else:
        perms.append(PROGRAM_PERMS[row['program']])

    is_supervisor = (row.get('supervisor', '').lower() in ('y', 'yes', 'x'))
    if is_supervisor:
        perms.append('supervisor')

    def add_perm(u, perm_name):
        u.user_permissions.add(Permission.objects.get(codename=perm_name))

    u = User()
    u.username = row['username']
    u.first_name = row['first name']
    u.last_name = row['last name']
    u.email = row.get('email', '*****@*****.**')
    u.set_password(row['password'])
    u.save()

    for p in perms:
        add_perm(u, p)
    u.save()

    try:
        contact = Contact.objects.get(user__username=row['username'])
        return
    except Contact.DoesNotExist:
        pass

    if row['state'] == 'national':
        loc = Location.objects.get(slug='nigeria')
    else:
        loc = Location.objects.get(type__slug='state', slug=row['state'])

    c = Contact()
    c.name = '%s %s' % (u.first_name, u.last_name)
    c.first_name = u.first_name
    c.last_name = u.last_name
    c.email = row.get('email', '')
    c.user = u
    c.location = loc
    c.save()

    backend = Backend.objects.get(name='httptester')

    if row.get('phone'):
        conn = Connection()
        conn.backend = backend
        conn.identity = row['phone']
        conn.contact = c
        conn.save()
Exemple #21
0
def registration(req, pk=None, template="registration/dashboard.html", 
                 contact_form=CommoditiesContactForm):
    contact = None
    connection = None
    bulk_form = None
    search = None
    registration_view = 'registration'
    registration_edit = 'registration_edit'
    if hasattr(settings, 'SMS_REGISTRATION_VIEW'):
        registration_view = settings.SMS_REGISTRATION_VIEW
    if hasattr(settings, 'SMS_REGISTRATION_EDIT'):
        registration_edit = settings.SMS_REGISTRATION_EDIT

    if pk is not None:
        contact = get_object_or_404(
            Contact, pk=pk)
        try:
            connection = Connection.objects.get(contact=contact)
        except Connection.DoesNotExist:
            connection = None
    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            name = unicode(contact)
            contact.delete()
            return HttpResponseRedirect("%s?deleted=%s" % (reverse(registration_view), name))
        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,\
                    contact=contact)
                connection.save()

            return HttpResponseRedirect(
                reverse(registration_view))
        else:
            contact_form = contact_form(
                instance=contact,
                data=req.POST)

            if contact_form.is_valid():
                created = False
                if contact is None:
                    created = True
                contact = contact_form.save()
                if created:
                    response = "Dear %(name)s, you have been registered on %(site)s" % \
                        {'name': contact.name, 
                         'site': Site.objects.get(id=settings.SITE_ID).domain }
                    send_message(contact.default_connection, response)
                    return HttpResponseRedirect("%s?created=%s" % (reverse(registration_edit, 
                                                                           kwargs={'pk':contact.pk}),
                                                                           unicode(contact)))
    else:
        if pk is None:
            supplypoint = None
            if "supplypoint" in req.GET and req.GET["supplypoint"]:
                try:
                    supplypoint = SupplyPoint.objects.get(code=req.GET["supplypoint"])
                except SupplyPoint.DoesNotExist, SupplyPoint.MultipleObjectsReturned:
                    pass
            contact_form = contact_form(
                instance=contact, 
                initial={'supply_point':supplypoint})
        else:
Exemple #22
0
class TestStockOnHand(TestScript):
    apps = ([logistics_app.App])
    fixtures = ["ghana_initial_data.json"]

    def setUp(self):
        settings.LOGISTICS_STOCKED_BY = 'user'
        TestScript.setUp(self)
        location = Location.objects.get(code='de')
        facilitytype = SupplyPointType.objects.get(code='hc')
        self.rms = SupplyPoint.objects.get(code='garms')
        facility, created = SupplyPoint.objects.get_or_create(
            code='dedh',
            name='Dangme East District Hospital',
            location=location,
            active=True,
            type=facilitytype,
            supplied_by=self.rms)
        assert facility.supplied_by == self.rms
        mc = Product.objects.get(sms_code='mc')
        self.lf = Product.objects.get(sms_code='lf')
        ProductStock(product=mc, supply_point=facility,
                     monthly_consumption=8).save()
        ProductStock(product=self.lf,
                     supply_point=facility,
                     monthly_consumption=5).save()
        facility = SupplyPoint(code='tf',
                               name='Test Facility',
                               location=location,
                               active=True,
                               type=facilitytype,
                               supplied_by=self.rms)
        facility.save()
        mc = Product.objects.get(sms_code='mc')
        mg = Product.objects.get(sms_code='mg')
        self.mc_stock = ProductStock(is_active=True,
                                     supply_point=facility,
                                     product=mc,
                                     monthly_consumption=10)
        self.mc_stock.save()
        self.lf_stock = ProductStock(is_active=True,
                                     supply_point=facility,
                                     product=self.lf,
                                     monthly_consumption=10)
        self.lf_stock.save()
        self.mg_stock = ProductStock(is_active=False,
                                     supply_point=facility,
                                     product=mg,
                                     monthly_consumption=10)
        self.mg_stock.save()

        ng = Product.objects.get(sms_code='ng')
        self.ng_stock = ProductStock(is_active=True,
                                     supply_point=facility,
                                     product=ng,
                                     monthly_consumption=None)
        self.ng_stock.save()

        self.contact = Contact(name='test user')
        self.contact.save()
        self.connection = Connection(backend=Backend.objects.all()[0],
                                     identity="888",
                                     contact=self.contact)
        self.connection.save()
        self.contact.supply_point = facility
        self.contact.save()
        self.contact.commodities.add(ng)

    def testProductReportsHelper(self):
        sdp = SupplyPoint()
        m = Message()
        p = ProductReportsHelper(sdp, Reports.SOH, m)
        p.add_product_stock('lf', 10, save=False)
        p.add_product_stock('mc', 30, save=False)
        p.add_product_stock('aa', 0, save=False)
        p.add_product_stock('oq', 0, save=False)
        self.assertEquals(p.all(), "lf 10, aa 0, oq 0, mc 30")
        self.assertEquals(p.stockouts(), "aa oq")
        my_iter = p._getTokens("ab10cd20")
        self.assertEquals(my_iter.next(), 'ab')
        self.assertEquals(my_iter.next(), '10')
        self.assertEquals(my_iter.next(), 'cd')
        self.assertEquals(my_iter.next(), '20')

    def testStockOnHand(self):
        a = """
           16176023315 > register stella dedh
           16176023315 < Congratulations stella, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           16176023315 > soh lf 10 mc 20
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           16176023315 > SOH LF 10 MC 20
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           """
        self.runScript(a)

    def testNothing(self):
        a = """
           16176023315 > register stella dedh
           16176023315 < Congratulations stella, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 >
           16176023315 < Sorry, I could not understand your message. Please contact your DHIO for help, or visit http://www.ewsghana.com
           16176023315 > soh
           16176023315 < To report stock on hand, send SOH [space] [product code] [space] [amount] 
           """
        self.runScript(a)

    def testStockout(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 0 mc 0
           16176023315 < Dear cynthia, these items are stocked out: lf mc. Please order 24 mc, 15 lf.
           """
        self.runScript(a)

    def testStockoutNoConsumption(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh ng 0
           16176023315 < Dear cynthia, these items are stocked out: ng.
           """
        self.runScript(a)

    def testLowSupply(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 7 mc 9
           16176023315 < Dear cynthia, these items need to be reordered: lf mc. Please order 15 mc, 8 lf.
           """
        self.runScript(a)

    def testLowSupplyNoConsumption(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh ng 3
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           """
        self.runScript(a)

    def testOverSupply(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 30 mc 40
           16176023315 < Dear cynthia, these items are overstocked: lf mc. The district admin has been informed.
           """
        self.runScript(a)

    def testSohAndReceipts(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10 20 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 20.
           """
        self.runScript(a)

    def testCombined1(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh lf 0 mc 1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Lofem; below reorder level Male Condom
           pharmacist < Dear cynthia, these items are stocked out: lf. these items need to be reordered: mc. Please order 29 mc, 30 lf.
           """
        self.runScript(a)

    def testCombined2(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > mc 0 mg 1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           pharmacist > mc 0 mg 1 lf 100
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G; overstocked Lofem
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined3(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh mc 0 mg 1 ng 300
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist <  Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           pharmacist > soh mc 0-2 mg 1-1 ng 300-1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist <  Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined4(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh mc 0 mg 1 ng300-4
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined5(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > mc 16 lf 16 mg300
           super < Dear super, Test Facility is experiencing the following problems: overstocked Micro-G
           pharmacist < Dear cynthia, these items are overstocked: mg. The district admin has been informed.
           """
        self.runScript(a)

    def testStringCleaner(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10-20 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 20.
           """
        self.runScript(a)

    def testBadCode(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > lf 0 badcode 10
           16176023315 < You reported: lf, but there were errors: Unrecognized commodity codes: badcode. Please contact your DHIO for assistance.
           16176023315 > badcode 10
           16176023315 < badcode is not a recognized commodity code. Please contact your DHIO for assistance.
           16176023315 > soh lf 10.10 m20
           16176023315 < You reported: lf, but there were errors: Unrecognized commodity codes: m. Please contact your DHIO for assistance.
           16176023315 > ad50 -0 as65-0 al25-0 qu0-0 sp0-0 rd0-0
           16176023315 < You reported: rd, sp, qu, ad, al, but there were errors: Unrecognized commodity codes: as. Please contact your DHIO for assistance.
           """
        self.runScript(a)

    def FAILSbadcode(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 0 bad_code 10
           16176023315 < You reported: lf, but there were errors: BAD_CODE is/are not part of our commodity codes. Please contact your DHIO for assistance.
           16176023315 > soh bad_code 10
           16176023315 < BAD_CODE is/are not part of our commodity codes. Please contact your DHIO for assistance.
           """
        self.runScript(a)

    def testPunctuation(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 >   soh lf 10 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > sohlf10mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > lf10mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10MC 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-1MC 20,3
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 1, mc 3.
           16176023315 > LF(10), mc (20)
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-mc20-
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-3mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 3.
           16176023315 > LF10----3mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 3.
           """
        self.runScript(a)

    def failTestRMSStockout(self):
        """ This test doesn't pass yet. Something about signals not firing? """
        a = """
           111 > register garep garms
           111 < Congratulations garep, you have successfully been registered for the Early Warning System. Your facility is Greater Accra Regional Medical Store
           222 > register derep dedh
           222 < Congratulations derep, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           111 > soh lf 0
           111 < Dear garep, these items are stocked out: lf.
           222 < Dear derep, Greater Accra Regional Medical Store is STOCKED OUT of: lf
           111 > soh lf 10
           111 < Dear garep, thank you for reporting the commodities you have in stock.
           222 < Dear derep, Greater Accra Regional Medical Store has RESOLVED the following stockouts: lf
           """
        self.runScript(a)

    def tearDown(self):
        TestScript.tearDown(self)
        self.mc_stock.delete()
        self.mg_stock.delete()
        self.lf_stock.delete()
Exemple #23
0
    def handle(self, text):
        b = InputCleaner()
        if is_eligible_for_results(self.msg.connection):
            # refuse re-registration if they're still active and eligible
            self.respond(self.ALREADY_REGISTERED, 
                         name=self.msg.connection.contact.name,
                         location=self.msg.connection.contact.location)
            return
        
        text = text.strip()
        text = b.remove_double_spaces(text)
        if len(text) < (self.PIN_LENGTH + self.MIN_CLINIC_CODE_LENGTH + self.MIN_NAME_LENGTH + 1):
            self.mulformed_msg_help()
            return

        #signed pin
        if text[-5:-4] == '-' or text[-5:-4] == '+':
            self.invalid_pin(text[-5:])
            return
        #too long pin
        if ' ' in text and text[1 + text.rindex(' '):].isdigit() and len(text[1 + text.rindex(' '):]) > self.PIN_LENGTH:
            self.invalid_pin(text[1 + text.rindex(' '):])
            return
        #non-white space before pin
        if text[-5:-4] != ' ' and text[-4:-3] != ' ':
            self.respond("Sorry, you should put a space before your pin. "
                         "Please make sure your code is a %s-digit number like %s. "
                         "Send JOIN <CLINIC CODE> <YOUR NAME> <SECURITY CODE>." % (
                         self.PIN_LENGTH, ''.join(str(i) for i in range(1, int(self.PIN_LENGTH) + 1))))
            return
        #reject invalid pin
        user_pin = text[-4:]
        if not user_pin:
            self.help()
            return
        elif len(user_pin) < 4:
            self.invalid_pin(user_pin)
            return
        elif not user_pin.isdigit():
            self.invalid_pin(user_pin)
            return

        
        group = self.PATTERN.search(text)
        if group is None:
            self.mulformed_msg_help()
            return

        tokens = group.groups()
        if not tokens:
            self.mulformed_msg_help()
            return

        clinic_code = tokens[0].strip()
        clinic_code = b.try_replace_oil_with_011(clinic_code)
        #we expect all codes have format PPDDFF or PPDDFFS
        clinic_code = clinic_code[0:6]
        name = tokens[2]
        name = name.title().strip()
        pin = tokens[4].strip()
        if len(pin) != self.PIN_LENGTH:
            self.respond(self.INVALID_PIN)
            return
        if not name:
            self.respond("Sorry, you must provide a name to register. %s" % self.HELP_TEXT)
            return
        elif len(name) < self.MIN_NAME_LENGTH:
            self.respond("Sorry, you must provide a valid name to register. %s" % self.HELP_TEXT)
            return
        try:
            location = Location.objects.get(slug__iexact=clinic_code,
                                            type__slug__in=const.CLINIC_SLUGS)
            if self.msg.connection.contact is not None \
               and self.msg.connection.contact.is_active:
                # this means they were already registered and active, but not yet 
                # receiving results.
                clinic = get_clinic_or_default(self.msg.connection.contact) 
                if clinic != location:
                    self.respond(self.ALREADY_REGISTERED,
                                 name=self.msg.connection.contact.name,
                                 location=clinic)
                    return True
                else: 
                    contact = self.msg.contact
            else:
                contact = Contact(location=location)
                clinic = get_clinic_or_default(contact)
            contact.name = name
            contact.pin = pin
            contact.save()
            contact.types.add(const.get_clinic_worker_type())
            
            self.msg.connection.contact = contact
            self.msg.connection.save()
            
            self.respond("Hi %(name)s, thanks for registering for "
                         "Results160 from %(location)s. "
                         "Your PIN is %(pin)s. "
                         "Reply with keyword 'HELP' if this is "
                         "incorrect", name=contact.name, location=clinic.name,
                         pin=pin)
        except Location.DoesNotExist:
            self.respond("Sorry, I don't know about a location with code %(code)s. Please check your code and try again.",
                         code=clinic_code)
Exemple #24
0
class TestStockOnHand (TestScript):
    apps = ([logistics_app.App])
    fixtures = ["ghana_initial_data.json"] 
    def setUp(self):
        settings.LOGISTICS_STOCKED_BY = 'user'
        TestScript.setUp(self)
        location = Location.objects.get(code='de')
        facilitytype = SupplyPointType.objects.get(code='hc')
        self.rms = SupplyPoint.objects.get(code='garms')
        facility, created = SupplyPoint.objects.get_or_create(code='dedh',
                                                           name='Dangme East District Hospital',
                                                           location=location, active=True,
                                                           type=facilitytype, supplied_by=self.rms)
        assert facility.supplied_by == self.rms
        mc = Product.objects.get(sms_code='mc')
        self.lf = Product.objects.get(sms_code='lf')
        ProductStock(product=mc, supply_point=facility,
                     monthly_consumption=8).save()
        ProductStock(product=self.lf, supply_point=facility,
                     monthly_consumption=5).save()
        facility = SupplyPoint(code='tf', name='Test Facility',
                       location=location, active=True,
                       type=facilitytype, supplied_by=self.rms)
        facility.save()
        mc = Product.objects.get(sms_code='mc')
        mg = Product.objects.get(sms_code='mg')
        self.mc_stock = ProductStock(is_active=True, supply_point=facility,
                                    product=mc, monthly_consumption=10)
        self.mc_stock.save()
        self.lf_stock = ProductStock(is_active=True, supply_point=facility,
                                    product=self.lf, monthly_consumption=10)
        self.lf_stock.save()
        self.mg_stock = ProductStock(is_active=False, supply_point=facility,
                                     product=mg, monthly_consumption=10)
        self.mg_stock.save()

        ng = Product.objects.get(sms_code='ng')
        self.ng_stock = ProductStock(is_active=True, supply_point=facility,
                                    product=ng, monthly_consumption=None)
        self.ng_stock.save()
        
        self.contact = Contact(name='test user')
        self.contact.save()
        self.connection = Connection(backend=Backend.objects.all()[0],
                                     identity="888",
                                     contact=self.contact)
        self.connection.save()
        self.contact.supply_point = facility
        self.contact.save()
        self.contact.commodities.add(ng)
    
    
    def testProductReportsHelper(self):
        sdp = SupplyPoint()
        m = Message()
        p = ProductReportsHelper(sdp, Reports.SOH, m)
        p.add_product_stock('lf',10, save=False)
        p.add_product_stock('mc',30, save=False)
        p.add_product_stock('aa',0, save=False)
        p.add_product_stock('oq',0, save=False)
        self.assertEquals(p.all(), "lf 10, aa 0, oq 0, mc 30")
        self.assertEquals(p.stockouts(), "aa oq")
        my_iter = p._getTokens("ab10cd20")
        self.assertEquals(my_iter.next(),'ab')
        self.assertEquals(my_iter.next(),'10')
        self.assertEquals(my_iter.next(),'cd')
        self.assertEquals(my_iter.next(),'20')

    def testStockOnHand(self):
        a = """
           16176023315 > register stella dedh
           16176023315 < Congratulations stella, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           16176023315 > soh lf 10 mc 20
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           16176023315 > SOH LF 10 MC 20
           16176023315 < Dear stella, thank you for reporting the commodities you have in stock.
           """
        self.runScript(a)

    def testNothing(self):
        a = """
           16176023315 > register stella dedh
           16176023315 < Congratulations stella, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 >
           16176023315 < Sorry, I could not understand your message. Please contact your DHIO for help, or visit http://www.ewsghana.com
           16176023315 > soh
           16176023315 < To report stock on hand, send SOH [space] [product code] [space] [amount] 
           """
        self.runScript(a)

    def testStockout(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 0 mc 0
           16176023315 < Dear cynthia, these items are stocked out: lf mc. Please order 24 mc, 15 lf.
           """
        self.runScript(a)

    def testStockoutNoConsumption(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh ng 0
           16176023315 < Dear cynthia, these items are stocked out: ng.
           """
        self.runScript(a)

    def testLowSupply(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 7 mc 9
           16176023315 < Dear cynthia, these items need to be reordered: lf mc. Please order 15 mc, 8 lf.
           """
        self.runScript(a)

    def testLowSupplyNoConsumption(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh ng 3
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           """
        self.runScript(a)

    def testOverSupply(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 30 mc 40
           16176023315 < Dear cynthia, these items are overstocked: lf mc. The district admin has been informed.
           """
        self.runScript(a)

    def testSohAndReceipts(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10 20 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 20.
           """
        self.runScript(a)

    def testCombined1(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh lf 0 mc 1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Lofem; below reorder level Male Condom
           pharmacist < Dear cynthia, these items are stocked out: lf. these items need to be reordered: mc. Please order 29 mc, 30 lf.
           """
        self.runScript(a)

    def testCombined2(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > mc 0 mg 1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           pharmacist > mc 0 mg 1 lf 100
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G; overstocked Lofem
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined3(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh mc 0 mg 1 ng 300
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist <  Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           pharmacist > soh mc 0-2 mg 1-1 ng 300-1
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist <  Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined4(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > soh mc 0 mg 1 ng300-4
           super < Dear super, Test Facility is experiencing the following problems: stockouts Male Condom; below reorder level Micro-G
           pharmacist < Dear cynthia, these items are stocked out: mc. these items need to be reordered: mg. Please order 30 mc, 29 mg.
           """
        self.runScript(a)

    def testCombined5(self):
        a = """
           pharmacist > register cynthia tf
           pharmacist < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           super > register super tf incharge
           super < Congratulations super, you have successfully been registered for the Early Warning System. Your facility is Test Facility
           pharmacist > mc 16 lf 16 mg300
           super < Dear super, Test Facility is experiencing the following problems: overstocked Micro-G
           pharmacist < Dear cynthia, these items are overstocked: mg. The district admin has been informed.
           """
        self.runScript(a)

    def testStringCleaner(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 10-20 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 20.
           """
        self.runScript(a)

    def testBadCode(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > lf 0 badcode 10
           16176023315 < You reported: lf, but there were errors: Unrecognized commodity codes: badcode. Please contact your DHIO for assistance.
           16176023315 > badcode 10
           16176023315 < badcode is not a recognized commodity code. Please contact your DHIO for assistance.
           16176023315 > soh lf 10.10 m20
           16176023315 < You reported: lf, but there were errors: Unrecognized commodity codes: m. Please contact your DHIO for assistance.
           16176023315 > ad50 -0 as65-0 al25-0 qu0-0 sp0-0 rd0-0
           16176023315 < You reported: rd, sp, qu, ad, al, but there were errors: Unrecognized commodity codes: as. Please contact your DHIO for assistance.
           """
        self.runScript(a)

    def FAILSbadcode(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 > soh lf 0 bad_code 10
           16176023315 < You reported: lf, but there were errors: BAD_CODE is/are not part of our commodity codes. Please contact your DHIO for assistance.
           16176023315 > soh bad_code 10
           16176023315 < BAD_CODE is/are not part of our commodity codes. Please contact your DHIO for assistance.
           """
        self.runScript(a)

    def testPunctuation(self):
        a = """
           16176023315 > register cynthia dedh
           16176023315 < Congratulations cynthia, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           16176023315 >   soh lf 10 mc 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > sohlf10mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > lf10mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10MC 20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-1MC 20,3
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 1, mc 3.
           16176023315 > LF(10), mc (20)
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-mc20-
           16176023315 < Dear cynthia, thank you for reporting the commodities you have in stock.
           16176023315 > LF10-3mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 3.
           16176023315 > LF10----3mc20
           16176023315 < Dear cynthia, thank you for reporting the commodities you have. You received lf 3.
           """
        self.runScript(a)

    def failTestRMSStockout(self):
        """ This test doesn't pass yet. Something about signals not firing? """
        a = """
           111 > register garep garms
           111 < Congratulations garep, you have successfully been registered for the Early Warning System. Your facility is Greater Accra Regional Medical Store
           222 > register derep dedh
           222 < Congratulations derep, you have successfully been registered for the Early Warning System. Your facility is Dangme East District Hospital
           111 > soh lf 0
           111 < Dear garep, these items are stocked out: lf.
           222 < Dear derep, Greater Accra Regional Medical Store is STOCKED OUT of: lf
           111 > soh lf 10
           111 < Dear garep, thank you for reporting the commodities you have in stock.
           222 < Dear derep, Greater Accra Regional Medical Store has RESOLVED the following stockouts: lf
           """
        self.runScript(a)

    def tearDown(self):
        TestScript.tearDown(self)
        self.mc_stock.delete()
        self.mg_stock.delete()
        self.lf_stock.delete()
Exemple #25
0
def populate_user(row):
    for k, v in row.items():
        if v == "":
            del row[k]

    NON_REQUIRED_FIELDS = ["email", "perm"]

    for k, v in row.iteritems():
        if v is None and k not in NON_REQUIRED_FIELDS:
            print "%s is required" % k
            return

    try:
        User.objects.get(username=row["username"])
        print "user %s already exists" % row["username"]
        return
    except User.DoesNotExist:
        pass

    ALLOWED_STATES = ("fct", "nasawara", "national")
    if not row["state"] in ALLOWED_STATES:
        print "state must be one of: %s" % ", ".join(ALLOWED_STATES)
        return

    if "perm" in row and not row["perm"] in ALLOWED_PERMS:
        print "perm must be one of: %s" % ", ".join(ALLOWED_PERMS)
        return

    if "perm" in row:
        perm = Permission.objects.get(codename=row["perm"])
    else:
        perm = None

    u = User()
    u.username = row["username"]
    u.first_name = row["first name"]
    u.last_name = row["last name"]
    u.email = row.get("email", "*****@*****.**")
    u.set_password(row["password"])
    u.save()

    if perm:
        u.user_permissions.add(perm)

    try:
        contact = Contact.objects.get(user__username=row["username"])
        return
    except Contact.DoesNotExist:
        pass

    if row["state"] == "national":
        loc = Location.objects.get(slug="nigeria")
    else:
        loc = Location.objects.get(type__slug="state", slug=row["state"])

    c = Contact()
    c.name = "%s %s" % (u.first_name, u.last_name)
    c.first_name = u.first_name
    c.last_name = u.last_name
    c.email = row.get("email", "")
    c.user = u
    c.location = loc
    c.save()
Exemple #26
0
def migrate():

    for product in old_models.Product.objects.all():
        p = new_models.Product(name=product.name,
                               units=product.units,
                               sms_code=product.sms_code,
                               description=product.description)
        p.save()

    for p in old_models.ProductReportType.objects.all():
        r = new_models.ProductReportType(name=p.name, sms_code=p.sms_code)
        r.save()

    # Necessary because there's no slug field
    types = (("MOHSW", "moh"), ("REGION", "reg"), ("DISTRICT", "dis"),
             ("FACILITY", "fac"))

    for t in types:
        nt = new_models.SupplyPointType(name=t[0], code=t[1])
        nt.save()

    for object in old_models.ServiceDeliveryPoint.objects.all():
        if new_models.SupplyPoint.objects.filter(name=object.name).exists():
            return

        l = new_models.Location(point=object.point if object.point else None,
                                type=object.type,
                                parent_type=object.parent_type,
                                parent_id=object.parent_id,
                                parent=object.parent)
        l.save()
        sp = new_models.SupplyPoint(
            name=object.sdp_name,
            is_active=object.active,
            location=l,
            type=new_models.SupplyPointType.objects.get(name=object.type.name))
        if new_models.SupplyPoint.objects.filter(
                name=sp.location.parent.name).exists():
            sp.supplied_by = new_models.SupplyPoint.objects.get(
                name=sp.location.parent.name)

        sp.save()

        for a in old_models.ActiveProduct.objects.filter(
                service_delivery_point=object):
            ps = new_models.ProductStock(
                is_active=a.is_active,
                supply_point=sp,
                quantity=a.current_quantity,
                product=new_models.Product.objects.get(
                    sms_code=a.product.sms_code))
            ps.save()

    roles = (("Facility in-charge", "ic"), ("DMO", "dm"), ("RMO", "rm"),
             ("District Pharmacist", "dp"), ("MOHSW", "mh"), ("MSD", "ms"))

    for r in roles:
        c = new_models.ContactRole(name=r[0], code=r[1])
        c.save()
    for oc in old_models.ContactDetail.objects.all():
        c = Contact(name=oc.name,
                    role=new_models.ContactRole.objects.get(name=oc.role.name),
                    supply_point=new_models.SupplyPoint.objects.get(
                        name=oc.service_delivery_point.name))
        c.save()
        for cb in ConnectionBase.objects.filter(contact=oc):
            cb.contact = c
            cb.save()
 def test_that_retrieves_none_when_contact_do_not_have_a_poll(self):
     contact = Contact()
     contact.save()
     self.assertEqual(None, self.view.get_current_poll_for(contact))
Exemple #28
0
def registration(req,
                 pk=None,
                 template="registration/dashboard.html",
                 contact_form=CommoditiesContactForm):
    contact = None
    connection = None
    bulk_form = None
    search = None
    registration_view = 'registration'
    registration_edit = 'registration_edit'
    if hasattr(settings, 'SMS_REGISTRATION_VIEW'):
        registration_view = settings.SMS_REGISTRATION_VIEW
    if hasattr(settings, 'SMS_REGISTRATION_EDIT'):
        registration_edit = settings.SMS_REGISTRATION_EDIT

    if pk is not None:
        contact = get_object_or_404(Contact, pk=pk)
        try:
            connection = Connection.objects.get(contact=contact)
        except Connection.DoesNotExist:
            connection = None
    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            name = unicode(contact)
            contact.delete()
            return HttpResponseRedirect("%s?deleted=%s" %
                                        (reverse(registration_view), name))
        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,\
                    contact=contact)
                connection.save()

            return HttpResponseRedirect(reverse(registration_view))
        else:
            contact_form = contact_form(instance=contact, data=req.POST)

            if contact_form.is_valid():
                created = False
                if contact is None:
                    created = True
                contact = contact_form.save()
                if created:
                    response = "Dear %(name)s, you have been registered on %(site)s" % \
                        {'name': contact.name,
                         'site': Site.objects.get(id=settings.SITE_ID).domain }
                    send_message(contact.default_connection, response)
                    return HttpResponseRedirect(
                        "%s?created=%s" %
                        (reverse(registration_edit,
                                 kwargs={'pk': contact.pk}), unicode(contact)))
    else:
        if pk is None:
            supplypoint = None
            if "supplypoint" in req.GET and req.GET["supplypoint"]:
                try:
                    supplypoint = SupplyPoint.objects.get(
                        code=req.GET["supplypoint"])
                except SupplyPoint.DoesNotExist, SupplyPoint.MultipleObjectsReturned:
                    pass
            contact_form = contact_form(instance=contact,
                                        initial={'supply_point': supplypoint})
        else:
 def test_that_retrieves_none_when_contact_do_not_have_a_poll(self):
     contact = Contact()
     contact.save()
     self.assertEqual(None, self.view.get_current_poll_for(contact))
Exemple #30
0
def migrate():


    for product in old_models.Product.objects.all():
        p = new_models.Product(
            name=product.name,
            units=product.units,
            sms_code=product.sms_code,
            description=product.description
        )
        p.save()

    for p in old_models.ProductReportType.objects.all():
        r = new_models.ProductReportType(name=p.name,sms_code=p.sms_code)
        r.save()

    # Necessary because there's no slug field 
    types = (
        ("MOHSW", "moh"),
        ("REGION", "reg"),
        ("DISTRICT", "dis"),
        ("FACILITY", "fac")
    )

    for t in types:
        nt = new_models.SupplyPointType(
            name = t[0],
            code = t[1]
        )
        nt.save()

    for object in old_models.ServiceDeliveryPoint.objects.all():
        if new_models.SupplyPoint.objects.filter(name=object.name).exists():
            return

        l = new_models.Location(point=object.point if object.point else None,
                                type=object.type,
                                parent_type=object.parent_type,
                                parent_id=object.parent_id,
                                parent=object.parent)
        l.save()
        sp = new_models.SupplyPoint(
                    name = object.sdp_name,
                    is_active = object.active,
                    location = l,
                    type = new_models.SupplyPointType.objects.get(name=object.type.name))
        if new_models.SupplyPoint.objects.filter(name = sp.location.parent.name).exists():
            sp.supplied_by = new_models.SupplyPoint.objects.get(name = sp.location.parent.name)

        sp.save()
        
        for a in old_models.ActiveProduct.objects.filter(service_delivery_point=object):
            ps = new_models.ProductStock(is_active = a.is_active,
                                         supply_point = sp,
                                         quantity = a.current_quantity,
                                         product = new_models.Product.objects.get(sms_code=a.product.sms_code))
            ps.save()

    roles = (
        ("Facility in-charge", "ic"),
        ("DMO", "dm"),
        ("RMO", "rm"),
        ("District Pharmacist", "dp"),
        ("MOHSW", "mh"),
        ("MSD", "ms")
    )

    for r in roles:
        c = new_models.ContactRole(name=r[0], code=r[1])
        c.save()
    for oc in old_models.ContactDetail.objects.all():
        c = Contact(
            name = oc.name,
            role = new_models.ContactRole.objects.get(name=oc.role.name),
            supply_point=new_models.SupplyPoint.objects.get(name=oc.service_delivery_point.name)
        )
        c.save()
        for cb in ConnectionBase.objects.filter(contact=oc):
            cb.contact = c
            cb.save()
Exemple #31
0
def registration(req, pk=None):
    contact = None
    sellerSummary = None

    if pk is not None:
        contact = get_object_or_404(Contact, pk=pk)

    if req.method == "POST":
        if req.POST["submit"] == "Delete Contact":
            contact.delete()
            return HttpResponseRedirect(reverse(registration))

        elif "bulk" in req.FILES:
            # TODO use csv module
            #reader = csv.reader(open(req.FILES["bulk"].read(), "rb"))
            #for row in reader:
            for line in req.FILES["bulk"]:
                line_list = line.split(',')
                name = line_list[0].strip()
                backend_name = line_list[1].strip()
                identity = line_list[2].strip()

                contact = Contact(name=name)
                contact.save()
                # TODO deal with errors!
                backend = Backend.objects.get(name=backend_name)

                connection = Connection(backend=backend, identity=identity,\
                    contact=contact)
                connection.save()

            return HttpResponseRedirect(reverse(registration))
        else:
            contact_form = ContactForm(instance=contact, data=req.POST)

            if contact_form.is_valid():
                contact = contact_form.save()
                return HttpResponseRedirect(reverse(registration))

    else:
        contact_form = ContactForm(instance=contact)
        #Not allowing user to add contacts through the UI for now
        #If we eventually do, the line below sets the new contacts'
        #organization to that of the logged in user
        #################
        #instance=Contact(organization=req.user.get_profile().organization))
        seller_summary = getSellerSummary(contact)
        bulk_form = BulkRegistrationForm()

    if req.user.is_staff:
        ctable = ContactTable(Contact.objects.exclude(alias='nobody'),
                              request=req)
        org = None
    else:
        ctable = ContactTable(Contact.objects.filter(
            organization=req.user.get_profile().organization),
                              request=req)
        org = req.user.get_profile().organization

    return render_to_response("registration/dashboard.html", {
        "organization": org,
        "contacts_table": ctable,
        "contact_form": contact_form,
        "bulk_form": bulk_form,
        "contact": contact,
        "seller_summary": seller_summary
    },
                              context_instance=RequestContext(req))