Exemple #1
0
def data(req):
    template_name = "iavi/data.html"
    user = req.user
    try:
        profile = user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if user.is_superuser:
            # todo: allow access to everything
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})

    seven_days = timedelta(days=7)
    #thirty_days = timedelta(days=30)
    tomorrow = datetime.today() + timedelta(days=1)

    kenya_reports = KenyaReport.objects.filter(
        started__gte=tomorrow - seven_days).filter(
            reporter__location__in=locations).order_by("-started")
    uganda_reports = UgandaReport.objects.filter(
        started__gte=tomorrow - seven_days).filter(
            reporter__location__in=locations).order_by("-started")
    return render_to_response(req, template_name, {
        "kenya_reports": kenya_reports,
        "uganda_reports": uganda_reports
    })
Exemple #2
0
def data(req):
    template_name = "iavi/data.html"
    user = req.user
    try:
        profile = user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if user.is_superuser:
            # todo: allow access to everything
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})

    seven_days = timedelta(days=7)
    # thirty_days = timedelta(days=30)
    tomorrow = datetime.today() + timedelta(days=1)

    kenya_reports = (
        KenyaReport.objects.filter(started__gte=tomorrow - seven_days)
        .filter(reporter__location__in=locations)
        .order_by("-started")
    )
    uganda_reports = (
        UgandaReport.objects.filter(started__gte=tomorrow - seven_days)
        .filter(reporter__location__in=locations)
        .order_by("-started")
    )
    return render_to_response(req, template_name, {"kenya_reports": kenya_reports, "uganda_reports": uganda_reports})
Exemple #3
0
def data(req, id = None):
    allTrees = Tree.objects.all()
    # ok, the plan is to generate a table of responses per state, but this is tricky with loops.
    # the first thing we'll do is get all the possible states you can reach from the tree
    # then we'll tabulate the results of each state's first value
    # then we'll look at paths, by using the concatenated list of states taken for that path as a key
    if len(allTrees) != 0:
        t = get_tree(id)
        all_states = t.get_all_states()
        loops = t.has_loops() 
        if not loops:
            # this is the easy case.  just create one column per state and then display the results
            sessions = Session.objects.all().filter(tree=t)
            return render_to_response(req, "tree/data.html",
                                      { "trees": allTrees, "t": t, "states" : all_states, "sessions" : sessions, "loops" : loops}
                                      )
        else: 
            # here what we want is a table where the columns are every unique path through the 
            # tree, and the rows are the sessions, with the paths filled in.
            # Since there are loops we have to generate the list of unique paths from
            # the session data.  
            # So we get every session, and for every entry in that session we get the path.
            # If we haven't seen the path we add it to the master list.  
            # Then we walk back through the master list, and walk through each session to
            # see if it has an entry matching that path, and if so set the answer.  
            sessions = Session.objects.all().filter(tree=t)
            paths = {}
            # i think paths will be a dictionary of paths to dictionaries of sessions to answers
            # e.g. { <path> : { <session> : <answer>}
            # which will allow us to iterate through paths and say:
            # if paths[path].has_key(session):
            #    this_cell = paths[path][session]
            for session in sessions:
                entries = session.entry_set.all().order_by('sequence_id')
                path = ''
                for entry in entries:
                    path = path + str(entry.transition.current_state.id) + '/'
                    entry.path = path
                    if paths.has_key(path):
                        paths[path][session] = entry.transition.answer
                    else:
                        paths[path] = { session : entry.transition.answer }
            return render_to_response(req, "tree/data.html",
                                      { "trees": allTrees, "t": t, "paths" : paths, "sessions" : sessions, "loops" : loops }
                                      )
        # now we need to map all states to answers
        states_w_answers = {}
        for state in all_states:
            states_w_answers[state] = map((lambda x: x.answer), state.transition_set.all()) 
        # now we need to get all the entries
        all_entries = Entry.objects.all().filter(session__tree = t)
        if loops:
            # stupid error fix to prevent trees with loops from exploding.  This should be done better
            t = Tree()
            t.trigger = "Sorry, can't display this tree because it has loops.  We're working on it."
        return render_to_response(req, "tree/index.html",
            { "trees": allTrees, "t": t })
    else:
        return render_to_response("tree/index.html",
            context_instance=RequestContext(req))
Exemple #4
0
def select( request, 
            redirect_field_name = REDIRECT_FIELD_NAME,
            domain_select_template = 'domain/select.html' ):
    
    domains_for_user = Domain.active_for_user(request.user)
    if len(domains_for_user) == 0:       
        vals = dict( error_msg = "You are not a member of any existing domains - please contact your system administrator",
                     show_homepage_link = False   )
        return render_to_response(request, 'error.html', vals)
    
    redirect_to = request.REQUEST.get(redirect_field_name, '')    
    if request.method == 'POST': # If the form has been submitted...        
        form = DomainSelectionForm(domain_list=domains_for_user,
                                   data=request.POST) # A form bound to the POST data
                     
        if form.is_valid():
            # We've just checked the submitted data against a freshly-retrieved set of domains
            # associated with the user. It's safe to set the domain in the sesssion (and we'll
            # check again on views validated with the domain-checking decorator)
            form.save(request) # Needs request because it saves domain in session
    
            #  Weak attempt to give user a good UX - make sure redirect_to isn't garbage.
            if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
                redirect_to = reverse('homepage')
            return HttpResponseRedirect(redirect_to) # Redirect after POST
    else:
        # An unbound form
        form = DomainSelectionForm( domain_list=domains_for_user ) 

    vals = dict( next = redirect_to,
                 form = form )

    return render_to_response(request, domain_select_template, vals)
Exemple #5
0
def users(req):
    template_name = "iavi/users.html"
    current_user = req.user
    try:
        profile = current_user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if current_user.is_superuser:
            # todo: allow access to everything
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})

    all_users = User.objects.all()
    for user in all_users:
        try:
            profile = user.get_profile()
            # set some fields in the user object so we can access them in the template
            location_strings = [
                str(location) for location in profile.locations.all()
            ]
            user.locations = ", ".join(location_strings)
        except IaviProfile.DoesNotExist:
            user.locations = ""
        if user.is_superuser:
            user.permission_string = "Administrator"
        else:
            user.permission_string = ", ".join(
                [str(group) for group in user.groups.all()])

    return render_to_response(req, template_name, {"all_users": all_users})
Exemple #6
0
def users(req):
    template_name = "iavi/users.html"
    current_user = req.user
    try:
        profile = current_user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if current_user.is_superuser:
            # todo: allow access to everything
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})

    all_users = User.objects.all()
    for user in all_users:
        try:
            profile = user.get_profile()
            # set some fields in the user object so we can access them in the template
            location_strings = [str(location) for location in profile.locations.all()]
            user.locations = ", ".join(location_strings)
        except IaviProfile.DoesNotExist:
            user.locations = ""
        if user.is_superuser:
            user.permission_string = "Administrator"
        else:
            user.permission_string = ", ".join([str(group) for group in user.groups.all()])

    return render_to_response(req, template_name, {"all_users": all_users})
Exemple #7
0
def index(req):
    allTrees = Tree.objects.all()
    if len(allTrees) != 0:
		t = allTrees[len(allTrees) - 1]
		return render_to_response(req, "tree/index.html",
		    { "trees": allTrees, "t": t })
    else:
		return render_to_response(req, "tree/index.html", {})
Exemple #8
0
def report_view(req):
    cls = ReportMalnutrition

    report_title = cls._meta.verbose_name
    rows = []

    reports = cls.objects.all()
    i = 0
    for report in reports:
        i += 1
        row = {}
        row["cells"] = []
        row["cells"].append({"value": report.case})
        row["cells"].append({"value": report.reporter})
        row["cells"].append({"value": \
                report.entered_at.strftime("%d/%m/%Y")})
        row["cells"].append({"value": report.muac, "num": True})
        row["cells"].append({"value": report.height, "num": True})
        row["cells"].append({"value": report.weight, "num": True})
        row["cells"].append({"value": report.status})

        if i == 100:
            row['complete'] = True
            rows.append(row)
            break
        rows.append(row)

    columns, sub_columns = cls.table_columns()

    aocolumns_js = "{ \"sType\": \"html\" },"
    for col in columns[1:] + (sub_columns if sub_columns != None else []):
        if not 'colspan' in col:
            aocolumns_js += "{ \"asSorting\": [ \"desc\", \"asc\" ], " \
                            "\"bSearchable\": false },"
    aocolumns_js = aocolumns_js[:-1]

    aggregate = False
    print columns
    print sub_columns
    print len(rows)
    context_dict = {'get_vars': req.META['QUERY_STRING'],
                    'columns': columns, 'sub_columns': sub_columns,
                    'rows': rows, 'report_title': report_title,
                    'aggregate': aggregate, 'aocolumns_js': aocolumns_js}

    if req.method == 'GET' and 'excel' in req.GET:
        '''response = HttpResponse(mimetype="application/vnd.ms-excel")
        filename = "%s %s.xls" % \
                   (report_title, datetime.now().strftime("%d%m%Y"))
        response['Content-Disposition'] = "attachment; " \
                                          "filename=\"%s\"" % filename
        from findug.utils import create_excel
        response.write(create_excel(context_dict))
        return response'''
        return render_to_response(req, 'childcount/report.html', context_dict)
    else:
        return render_to_response(req, 'childcount/report.html', context_dict)
Exemple #9
0
def config_submit(req):
    c = MTurkConfig.objects.filter(current=True)
    if c:
        template_path = "xtrans/config_submit.html"
        f = ConfigForm(instance=c)
        return render_to_response(req, template_path, {'form':f})
    else:
        template_path = "xtrans/config_blank.html"
        return render_to_response(req,template_path,{})
Exemple #10
0
def index(req):
    allTrees = Tree.objects.all()
    if len(allTrees) != 0:
        t = allTrees[len(allTrees) - 1]
        return render_to_response(req, "tree/index.html", {
            "trees": allTrees,
            "t": t
        })
    else:
        return render_to_response(req, "tree/index.html", {})
Exemple #11
0
def custom_report(request, domain_id, report_name):
    context = {}
    context["report_name"] = report_name
    report_method = util.get_report_method(request.user.selected_domain, report_name)
    if not report_method:
        return render_to_response(request, 
                                  "custom/report_not_found.html",
                                  context)
    context["report_display"] = report_method.__doc__
    context["report_body"] = report_method(request)
    return render_to_response(request, "custom/base.html", context)
Exemple #12
0
def reports(request, template_name="list.html"):
    # not sure where this view will live in the UI yet
    context = {}
    extuser = request.extuser
    context["domain"] = extuser.domain
    context["case_reports"] = Case.objects.filter(domain=extuser.domain)
    context["sql_reports"] = SqlReport.objects.filter(domain=extuser.domain, is_active=True)
    context["custom_reports"] = util.get_custom_reports(extuser.domain)
    if not context["custom_reports"] and not context["sql_reports"] and not context["case_reports"]:
        return render_to_response(request, "domain_not_found.html", context)
    return render_to_response(request, template_name, context)
Exemple #13
0
def reports(request, template_name="list.html"):
    # not sure where this view will live in the UI yet
    context = {}
    context['case_reports'] = Case.objects.filter(domain=request.user.selected_domain)
    context['sql_reports'] = SqlReport.objects.filter(domain=request.user.selected_domain, is_active=True)
    context['custom_reports'] = util.get_custom_reports(request.user.selected_domain)
    if not context['custom_reports'] and not context['sql_reports']\
       and not context['case_reports']:
        return render_to_response(request, 
                                  "domain_not_found.html",
                                  context)
    return render_to_response(request, template_name, context)
Exemple #14
0
def all_builds(request, template_name="buildmanager/all_builds.html"):    
    context = {}    
    try: 
        extuser = ExtUser.objects.all().get(id=request.user.id)
        context["domain"] = extuser.domain
        projects = Project.objects.filter(domain=extuser.domain)
        builds = _get_build_dictionary(projects)
        context['all_builds'] = builds
    except ExtUser.DoesNotExist:
        template_name="hq/no_permission.html"
        return render_to_response(request, template_name, context)
    return render_to_response(request, template_name, context)
Exemple #15
0
 def post(req, template_name):
     xform_body = req.POST["xform"]
     try:
         result, errors, has_error = readable_form(xform_body)
         return render_to_response(req, template_name, {"success": True, 
                                                        "message": "Your form was successfully validated!",
                                                        "xform": xform_body,
                                                        "readable_form": result
                                                        })
     except Exception, e:
         return render_to_response(req, template_name, {"success": False, 
                                                        "message": "Failure to generate readable xform! %s" % e,
                                                        "xform": xform_body
                                                        })
Exemple #16
0
 def post(req, template_name):
     xform_body = req.POST["xform"]
     hq_validation = True if "hq-validate" in req.POST else False
     try:
         xformvalidator.validate_xml(xform_body, do_hq_validation=hq_validation)
         return render_to_response(
             req,
             template_name,
             {"success": True, "message": "Your form was successfully validated!", "xform": xform_body},
         )
     except Exception, e:
         return render_to_response(
             req, template_name, {"success": False, "message": "Validation Fail! %s" % e, "xform": xform_body}
         )
Exemple #17
0
def compliance(req):
    template_name = "iavi/compliance.html"

    user = req.user
    try:
        profile = user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if user.is_superuser:
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})

    reporters = IaviReporter.objects.filter(
        location__in=locations).order_by('alias')
    seven_days = timedelta(days=7)
    thirty_days = timedelta(days=30)
    today = datetime.today()
    tomorrow = today + timedelta(days=1)
    for reporter in reporters:

        all_reports = Report.objects.filter(reporter=reporter)
        last_7 = all_reports.filter(started__gte=today - seven_days)
        last_30 = all_reports.filter(started__gte=today - thirty_days)

        reporter.all_reports = len(all_reports)
        reporter.all_compliant = len(all_reports.filter(status="F"))
        if reporter.all_reports != 0:
            reporter.all_ratio = float(reporter.all_compliant) / float(
                reporter.all_reports)
            reporter.all_flag = _get_flag(reporter.all_ratio)

        reporter.past_7_reports = len(last_7)
        reporter.past_7_compliant = len(last_7.filter(status="F"))
        if reporter.past_7_reports != 0:
            reporter.past_7_ratio = float(reporter.past_7_compliant) / float(
                reporter.past_7_reports)
            reporter.past_7_flag = _get_flag(reporter.past_7_ratio)

        reporter.past_30_reports = len(last_30)
        reporter.past_30_compliant = len(last_30.filter(status="F"))
        if reporter.past_30_reports != 0:
            reporter.past_30_ratio = float(reporter.past_30_compliant) / float(
                reporter.past_30_reports)
            reporter.past_30_flag = _get_flag(reporter.past_30_ratio)

    return render_to_response(req, template_name, {"reporters": reporters})
Exemple #18
0
def index(request, template="weltel/index.html"):
    context = {}
    sites = Site.objects.all().order_by('name')
    start_of_week = datetime.now()
    # set to monday 00:00
    start_of_week = start_of_week - timedelta(days=start_of_week.weekday(),
                                              hours=start_of_week.hour,
                                              minutes=start_of_week.minute)

    for site in sites:
        patients = Patient.objects.filter(site=site)
        site.patient_count = patients.count()
        site.nurse_count = Nurse.objects.filter(sites=site).count()
        sawa_patients = patients.filter(state__code=SAWA_CODE)
        shida_patients = patients.filter(state__code=SHIDA_CODE)
        site.sawa_count = sawa_patients.count()
        site.shida_count = shida_patients.count()

        sawa_patients_this_week = sawa_patients.filter(active=True).filter(
            subscribed=True)
        sawa_patients_this_week = sawa_patients_this_week.filter(
            eventlog__date__gte=start_of_week)
        site.sawa_count_this_week = sawa_patients_this_week.distinct().count()
        shida_patients_this_week = shida_patients.filter(active=True).filter(
            subscribed=True)
        shida_patients_this_week = shida_patients_this_week.filter(
            eventlog__date__gte=start_of_week)
        site.shida_count_this_week = shida_patients_this_week.distinct().count(
        )
    context['sites'] = paginated(request, sites)
    #messages = EventLog.objects.select_related().order_by('-received')
    #context.update( format_events_in_context(request, context, messages) )
    return render_to_response(request, template, context)
Exemple #19
0
def user_edit(req, id):
    user_to_edit = User.objects.get(id=id)
    try:
        profile = user_to_edit.get_profile()
    except IaviProfile.DoesNotExist:
        profile = None
    if req.method == 'POST':
        user_form = UserForm(req.POST, instance=user_to_edit)
        profile_form = IaviProfileForm(req.POST, instance=profile)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save()
            if user.is_superuser:
                # make sure any super user is also staff so they
                # can easily change passwords
                user.is_staff = True

                user.save()

            profile = profile_form.save(commit=False)
            profile.user = user
            profile.save()
            profile_form.save_m2m()
            return HttpResponseRedirect('/iavi/users')
    else:
        user_form = UserForm(instance=user_to_edit)
        profile_form = IaviProfileForm(instance=profile)
    template_name = "iavi/user_edit.html"
    return render_to_response(
        req, template_name, {
            "current_user": user_to_edit,
            "user_form": user_form,
            "profile_form": profile_form
        })
Exemple #20
0
def show_build(request, build_id, template_name="buildmanager/show_build.html"):
    context = {}
    try:
        context["build"] = ProjectBuild.objects.get(id=build_id)
    except:
        raise Http404
    return render_to_response(request, template_name, context)
Exemple #21
0
def schools(req, template_name="schools/school_list.html"):
    regions = Location.objects.filter(type__name="Region")
    districts = None
    region = None
    district = None

    filter_params = get_location_filter_params(req)
    print filter_params
    schools = School.objects.filter(**filter_params)

    if "region" in req.GET:
        region = Location.objects.get(id=req.GET["region"])
    elif "district" in req.GET:
        district = Location.objects.get(id=req.GET["district"])
        region = district.parent
    if region:
        districts = region.children.filter(type__name="District")
    else:
        schools = School.objects.all()
    return render_to_response(
        req, template_name, {
            "regions": regions,
            "districts": districts,
            "selected_region": region,
            "selected_district": district,
            "schools": schools
        })
Exemple #22
0
def index(req):
    facilities = Facility.objects.all().order_by('name')
    if req.method == 'POST': # If the form has been submitted...
        form = FilterChoiceForm(req.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # saving the form data is not cleaned
            #form.save()
            start_date = form.cleaned_data["start_date"]
            end_date = form.cleaned_data['end_date']
            status = form.cleaned_data['resource_status']
            
            resources = Resource.objects.filter(facility__in = facilities)
            resources = resources.filter(status__in = status)
            
            facilities = []
            for resource in resources:
                facilities.append(resource.facility)
            
            print 'START: %s -------------- END: %s ---------- STATUS: %s' % (start_date, end_date, status)
            #return HttpResponse('You just submit a form..Horray!')
    else:
        form = FilterChoiceForm() # An unbound form

    return render_to_response(req, 
                              'mapindex.html',
                              {
                               'facilities': facilities,
                               'form': form,
                               },                              
                              )
Exemple #23
0
def summary_trend(request, template_name="graphing/summary_trend.html"):
    """This is just a really really basic trend of total counts for a given set 
       of forms under this domain/organization"""    
    context = {}        
    formname = ''
    formdef_id = -1
    
    for item in request.GET.items():
        if item[0] == 'formdef_id':
            formdef_id=item[1]    
    if formdef_id == -1:
        context['chart_title'] = 'All Data'
        context['dataset'] = {}        
        defs = FormDefModel.objects.all().filter(domain=request.user.selected_domain)
    
        for fdef in defs:            
            d = dbhelper.DbHelper(fdef.element.table_name, fdef.form_display_name)            
            context['dataset'][fdef.form_display_name.__str__()] = d.get_counts_dataset(None,None)                    
    
    else:
        fdef = FormDefModel.objects.all().filter(id=formdef_id)
        context['chart_title'] = fdef[0].form_display_name
        d = dbhelper.DbHelper(fdef[0].element.table_name,fdef[0].form_display_name)        
        context['dataset'] = d.get_integer_series_dataset()
    
    context ['maxdate'] = 0;
    context ['mindate'] = 0;
    return render_to_response(request, template_name, context)
Exemple #24
0
def export(req, id = None):
    t = get_tree(id)
    all_states = t.get_all_states()
    loops = t.has_loops() 
    if not loops:
        output = StringIO()
        w = csv.writer(output)
        headings = ["Person", "Date"]
        headings.extend([state.question for state in all_states])
        w.writerow(headings)
        sessions = Session.objects.all().filter(tree=t)
        for session in sessions:
            values = [str(session.person), session.start_date]
            transitions = map((lambda x: x.transition), session.entry_set.all())
            states_w_transitions = {}
            for transition in transitions:
                states_w_transitions[transition.current_state] = transition
            for state in all_states:
                if states_w_transitions.has_key(state):
                    values.append(states_w_transitions[state].answer)
                else:
                    values.append("")
            w.writerow(values)
        # rewind the virtual file
        output.seek(0)
        response = HttpResponse(output.read(),
                            mimetype='application/ms-excel')
        response["content-disposition"] = "attachment; filename=%s.csv" % t.trigger
        return response
    else:
        return render_to_response(req, "tree/index.html",{})
Exemple #25
0
def view_graph(request, graph_id, template_name="graphing/view_graph.html"):
    context = {}    
    graph = RawGraph.objects.all().get(id=graph_id)
    
    #get the root group
    # inject some stuff into the rawgraph.  we can also do more
    # here but for now we'll just work with the domain and set 
    # some dates.  these can be templated down to the sql
    graph.domain = request.user.selected_domain.name
    startdate, enddate = utils.get_dates(request, graph.default_interval)
    graph.startdate = startdate.strftime("%Y-%m-%d")
    graph.enddate = (enddate + timedelta(days=1)).strftime("%Y-%m-%d")
    
    context['chart_title'] = graph.title
    context['chart_data'] = graph.get_flot_data()
    context['thegraph'] = graph
    
    rootgroup = utils.get_chart_group(request.user)    
    graphtree = get_graphgroup_children(rootgroup)    
    context['graphtree'] = graphtree
    context['view_name'] = 'graphing.views.view_graph'
    context['width'] = graph.width
    context['height'] = graph.height
    context['empty_dict'] = {}
    context['datatable'] = graph.convert_data_to_table(context['chart_data'])
    for item in request.GET.items():
        if item[0] == 'bare':
            template_name = 'graphing/view_graph_bare.html'
        elif item[0] == 'data':
            template_name='graphing/view_graph_data.html'
        elif item[0] == 'csv':             
            return _get_chart_csv(graph)
    return render_to_response(request, template_name, context)
Exemple #26
0
def reporter_view(req, reporter_id):
    ''' Displays a summary of his activities and history '''

    reporter = Reporter.objects.get(id=reporter_id)

    return render_to_response(req, 'findug/reporter.html',
                              {"reporter": reporter})
Exemple #27
0
def inspector(request, table_name, template_name="graphing/table_inspector.html"):
    context = {}
    context['table_name'] = table_name
    
    str_column = None
    str_column_value = None
    datetime_column = None
    data_column = None
    display_mode = None    
    
    for item in request.GET.items():
        if item[0] == 'str_column':
            str_column = item[1]                    
        if item[0] == 'str_column_value':
            str_column_value = item[1] 
        if item[0] == 'datetime_column':
            datetime_column = item[1]   
        if item[0] == 'data_column':
            data_column = item[1]        
        if item[0] == 'display_mode':
            display_mode = item[1]    
            
    context['str_column'] = str_column
    context['str_column_value'] = str_column_value
    context['datetime_column'] = datetime_column
    context['data_column'] = data_column
    context['display_mode'] = display_mode    
    
    return render_to_response(request, template_name, context)
Exemple #28
0
def basic_ui(req, number, skip_post=False, form_class=MessageForm):
    form_instance = form_class()
    template_name = "http/index.html"
    if req.method == 'POST' and req.POST.has_key("phone_number"):
        number = req.POST["phone_number"]
    msgs = Message.objects.all().filter(phone_number=number)
    if not skip_post and req.method == 'POST':
        form_instance = form_class(req.POST)
        if form_instance.is_valid():
            msg = form_instance.save(commit=False)
            msg.phone_number = number
            msg.date = datetime.datetime.now()
            msg.save()
            url = "http://localhost:8080/%s/%s" % (msg.phone_number,
                                                   urllib2.quote(msg.body))
            urllib2.urlopen(url)
            #return render_to_response('shared/thanks.html')
            return basic_ui(req, msg.phone_number, True)
        else:
            print "something bad happened"
    return render_to_response(req, template_name, {
        "form": form_instance,
        "msgs": msgs,
        "number": number
    })
Exemple #29
0
def index(req):
    template_name="logger/index_flat.html"
    columns = (("date", "Date"),
               ("connection__identity", "From/To"),
               ("connection__backend", "Backend"),
               ("is_incoming", "Direction"),
               ("text", "Message"))
    sort_column, sort_descending = _get_sort_info(req, default_sort_column="date", 
                                                  default_sort_descending=True)
    sort_desc_string = "-" if sort_descending else ""
    search_string = req.REQUEST.get("q", "")

    query = Message.objects.select_related("connection", "connection__backend"
            ).order_by("%s%s" % (sort_desc_string, sort_column))

    if search_string == "":
        query = query.all()

    else:
        query = query.filter(
           Q(text__icontains=search_string) |
           Q(connection__identity__icontains=search_string))

    messages = paginated(req, query)
    return render_to_response(req, template_name, {"columns": columns,
                                                   "messages": messages,
                                                   "sort_column": sort_column,
                                                   "sort_descending": sort_descending,
                                                   "search_string": search_string})
Exemple #30
0
def org_sms_report(request, template_name="hq/org_single_report.html"):
    context = {}
    # the decorator and middleware ensure this will be set.
    extuser = request.extuser
    startdate, enddate = utils.get_dates(request)
    context['startdate'] = startdate
    context['enddate'] = enddate    
    
    context['extuser'] = extuser
    context['domain'] = extuser.domain
    context['daterange_header'] = repinspector.get_daterange_header(startdate, enddate)
    context['view_name'] = 'hq.views.org_sms_report'
    
    # commented out because these reports aren't actually different reports
    # report = ReportSchedule.objects.get(id=id)
    # context["report"] = report
    # get the domain from the user, the root organization from the domain,
    # and then the report from the root organization
    #reporter.
    root_orgs = Organization.objects.filter(parent=None, domain=extuser.domain)
    # note: this pretty sneakily decides for you that you only care
    # about one root organization per domain.  should we lift this 
    # restriction?  otherwise this may hide data from you 
    root_org = root_orgs[0]
    
    # this call makes the meat of the report.
    #data = repinspector.get_data_below(root_org, startdate, enddate, 0)
    #data = custom._get_flat_data_for_domain(extuser.domain, startdate, enddate + timedelta(days=1))
    data = custom._get_flat_data_for_domain(extuser.domain, startdate, enddate + timedelta(days=1))
    heading = "Report for period: " + startdate.strftime('%m/%d/%Y') + " - " + enddate.strftime('%m/%d/%Y')
    rendered = reporter.render_direct_sms(data, startdate, enddate, 
                                          "hq/reports/sms_organization.txt", 
                                          {"heading" : heading })
    context['report_display'] = rendered
    return render_to_response(request, template_name, context)
Exemple #31
0
def index(req, scope):
    ''' Display Dashboard '''

    summary = {}
    if datetime.today().weekday() == 6:
        period = ReportPeriod.objects.latest()
    else:
        period = ReportPeriod.from_day(datetime.today())
    summary['period'] = period
    summary['total_units'] = len(scope.health_units())
    summary['up2date'] = len(filter(lambda hc: hc.up2date(),
                                               scope.health_units()))
    summary['missing'] = summary['total_units'] - summary['up2date']

    recent = []
    for report in EpidemiologicalReport.objects.filter(
                            _status=EpidemiologicalReport.STATUS_COMPLETED,
                            clinic__in=scope.health_units())\
                                            .order_by('-completed_on')[:10]:
        recent.append({'id': report.id,
                       'date': report.completed_on.strftime("%a %H:%M"),
                       'by': ('%s %s' %
                                    (report.completed_by().first_name,
                                     report.completed_by().last_name)).title(),
                       'by_id': report.completed_by().id,
                       'clinic': report.clinic,
                       'clinic_id': report.clinic.id})

    return render_to_response(req, 'findug/index.html',
                              {'summary': summary, 'scope': scope,
                               'recent': recent})
Exemple #32
0
def export(req, id=None):
    t = get_tree(id)
    all_states = t.get_all_states()
    loops = t.has_loops()
    if not loops:
        output = StringIO()
        w = csv.writer(output)
        headings = ["Person", "Date"]
        headings.extend([state.question for state in all_states])
        w.writerow(headings)
        sessions = Session.objects.all().filter(tree=t)
        for session in sessions:
            values = [str(session.person), session.start_date]
            transitions = map((lambda x: x.transition),
                              session.entry_set.all())
            states_w_transitions = {}
            for transition in transitions:
                states_w_transitions[transition.current_state] = transition
            for state in all_states:
                if states_w_transitions.has_key(state):
                    values.append(states_w_transitions[state].answer)
                else:
                    values.append("")
            w.writerow(values)
        # rewind the virtual file
        output.seek(0)
        response = HttpResponse(output.read(), mimetype='application/ms-excel')
        response[
            "content-disposition"] = "attachment; filename=%s.csv" % t.trigger
        return response
    else:
        return render_to_response(req, "tree/index.html", {})
Exemple #33
0
def map(req, scope):
    ''' Map view '''

    if datetime.today().weekday() == 6:
        previous_period = ReportPeriod.objects.latest()
    else:
        previous_period = ReportPeriod.from_day(datetime.today())

    all = []
    for location in scope.health_units():
        loc = {}
        loc['obj'] = location
        loc['name'] = unicode(location)
        loc['type'] = location.type.name.lower().replace(' ', '')
        act_reports = ACTConsumptionReport.objects.filter(
                                            reporter__location=location)\
                                                .filter(period=previous_period)
        if not act_reports:
            loc['act_unknown'] = True
        else:
            rpt = act_reports[0]
            if rpt.yellow_balance:
                loc['yellow'] = True
            if rpt.blue_balance:
                loc['blue'] = True
            if rpt.brown_balance:
                loc['brown'] = True
            if rpt.green_balance:
                loc['green'] = True

        all.append(loc)

    return render_to_response(req, 'findug/map.html',
                              {'scope': scope, 'locations': all})
def participant_edit(req, id):
    reporter = IaviReporter.objects.get(pk=id)
    if req.method == 'POST': 
        form = IaviReporterForm(req.POST) 
        if form.is_valid():
            # Process the data in form.cleaned_data
            id = req.POST["reporter_id"]
            if not id: 
                # should puke.  should also not be possible through the UI
                raise Exception("Reporter ID not set in form.  How did you get here?")
            reporter = IaviReporter.objects.get(id=id)
            reporter.pin = form.cleaned_data["pin"]
            reporter.location = form.cleaned_data["location"]
            reporter.alias = IaviReporter.get_alias(reporter.location.code, form.cleaned_data["participant_id"])
            reporter.save()
            conn = reporter.connection() 
            conn.identity = form.cleaned_data["phone"]
            conn.save()
            return HttpResponseRedirect('/iavi/participants/%s/' % id) 
    else:
        try:
            reporter = IaviReporter.objects.get(pk=id)
            if reporter.location:
                form = IaviReporterForm(initial={"participant_id" :reporter.study_id, "location" : reporter.location.pk,
                                                 "pin" : reporter.pin, "phone" : reporter.connection().identity } )
            else: 
                form = IaviReporterForm({"participant_id" :reporter.study_id, 
                                         "pin" : reporter.pin, "phone" : reporter.connection().identity } )
        except IaviReporter.NotFound:
            form = IaviReporterForm()

    template_name="iavi/participant_edit.html"
    return render_to_response(req, template_name, {"form" : form, "reporter" : reporter})
Exemple #35
0
def index(req):
    template_name="logger/index_flat.html"
    columns = (("date", "Date"),
               ("connection__identity", "From/To"),
               ("connection__backend", "Backend"),
               ("is_incoming", "Direction"),
               ("text", "Message"))
    sort_column, sort_descending = _get_sort_info(req, default_sort_column="date", 
                                                  default_sort_descending=True)
    sort_desc_string = "-" if sort_descending else ""
    search_string = req.REQUEST.get("q", "")

    query = Message.objects.select_related("connection", "connection__backend"
            ).order_by("%s%s" % (sort_desc_string, sort_column))

    if search_string == "":
        query = query.all()

    else:
        query = query.filter(
           Q(text__icontains=search_string) |
           Q(connection__identity__icontains=search_string))

    messages = paginated(req, query)
    return render_to_response(req, template_name, {"columns": columns,
                                                   "messages": messages,
                                                   "sort_column": sort_column,
                                                   "sort_descending": sort_descending,
                                                   "search_string": search_string})
Exemple #36
0
def annotations(request, attachment_id, allow_add=True):
    # TODO: error checking
    attach = Attachment.objects.get(id=attachment_id)
    annotes = attach.annotations.all()
    return render_to_response(request, "receiver/partials/annotations.html", {"attachment": attach, 
                                                                              "annotations": annotes, 
                                                                              "allow_add": allow_add})
Exemple #37
0
def manage_questions(req, id=None):
	
	# no argument = add a question
	# and list existing questions
	if id is None:
		ques = None
	
	# argument = edit an existing
	# question (although COMPLEX
	# LOGIC will apply here)
	else:
		ques = get_object_or_404(Question, pk=id)
		answers = ques.answers()
		# this is really dumb. django templates can't
		# deal with arrays, so we're forced to move
		# the answers into Q attributes, for now
		for n in range(0, len(answers)):
			setattr(ques, ("answer_%d" % (n+1)), answers[n])
	
	# otherwise, just render the ADD form
	return render_to_response(req, "poll/questions.html", {
		"questions": Question.objects.all().order_by("start"),
		"question": ques,
		"tab": "questions"
	})
Exemple #38
0
def single_submission(request, submission_id, template_name="receiver/single_submission.html"):
    context = {}        
    slog = Submission.objects.all().filter(id=submission_id)
    context['submission'] = slog[0]
    rawstring = str(slog[0].raw_header)
    
    # In order to display the raw header information, we need to 
    # escape the python object brackets in the output 
    rawstring = rawstring.replace(': <',': "<')
    rawstring = rawstring.replace('>,','>",')
    rawstring = rawstring.replace('>}','>"}') 
    processed_header = eval(rawstring)
    
    get_original = False
    for item in request.GET.items():
        if item[0] == 'get_original':
            get_original = True           
    
    if get_original:
        response = HttpResponse(mimetype='text/plain')
        fin = open(slog[0].raw_post ,'r')
        txt = fin.read()
        fin.close()
        response.write(txt) 
        return response
    
    attachments = Attachment.objects.all().filter(submission=slog[0])
    context ['processed_header'] = processed_header
    context['attachments'] = attachments
    return render_to_response(request, template_name, context)
def manage_questions(req, id=None):

    # no argument = add a question
    # and list existing questions
    if id is None:
        ques = None

    # argument = edit an existing
    # question (although COMPLEX
    # LOGIC will apply here)
    else:
        ques = get_object_or_404(Question, pk=id)
        answers = ques.answers()
        # this is really dumb. django templates can't
        # deal with arrays, so we're forced to move
        # the answers into Q attributes, for now
        for n in range(0, len(answers)):
            setattr(ques, ("answer_%d" % (n + 1)), answers[n])

    # otherwise, just render the ADD form
    return render_to_response(
        req, "poll/questions.html", {
            "questions": Question.objects.all().order_by("start"),
            "question": ques,
            "tab": "questions"
        })
Exemple #40
0
def samples_pop(request):
    """Popup (compact) view a group of samples for a particular day.
    """
    date =  request.REQUEST.get("date","").split('-')
    year = int(date[0])
    month = int(date[1]) - 1
    day = int(date[2])
    area = int(date[3]) 
    count =  get_count(day,month,year,area)
    date = "%s-%s-%s" % (year,month,day)

    template_name="sample_popup.html"
    context = {}
    context = {
        "year":year,
        "month": month,
        "day":day,
        "count": count,
        "date":date,
        "area":area
 
    }


    return render_to_response(request, template_name,context)
Exemple #41
0
def view(request):
    """Calendar view"""
    user = request.user
    date = datetime.datetime.now()
    default = dict(month=date.month, year=date.year, day=1, rowid=1,
            name="", desc="", when="", area = 0)
    url = request.path
    p = getParams(request, default)
    year, month, day, area = p['year'], p['month'], p['day'], p['area']
    search_string = Facility.objects.all()
    location_name = Facility.objects.filter(id = area)
    cal = CalendarController(day, area)
    cal.load(year, month)
    template_name="calendar.html"
    context = {}
    dict(username=user, cal=cal, url=url)
    i = 0
    context = {
        "username":user,
        "cal":cal,
        "url":url,
        "area":area,
        "search_string":search_string,
        'i':i,
        "location_name":location_name
    }
    return render_to_response(request, template_name, context)
Exemple #42
0
def toggle(req,status):
    if(status):
        status = 'On'
    else:
        status = 'Off'
    template_path = "xtrans/index.html"
    return render_to_response(req, template_path, {'status':status})
Exemple #43
0
def single_school(req, id, template_name="schools/single_school.html"):
    """View of a single school."""
    school = get_object_or_404(School, id=id)
    xml_location = "/schools/%s/xml" % id
    return render_to_response(req, template_name, {
        "school": school,
        "xml_location": xml_location
    })
Exemple #44
0
def patient_messages(request, pk, template="weltel/patient.html"):
    patient = get_object_or_404(Patient, id=pk)
    context = {}
    context['patient'] = patient
    logs = get_messages_for_patient(patient)
    if logs:
        context['messages'] = paginated(request, logs)
    return render_to_response(request, template, context)
def index(req):
    tmpls = Template.objects.values_list("key", "text")
    tmpl_map = dict([(int(k), t) for k, t in tmpls])

    all_tmpls = [{"key": n, "text": tmpl_map.get(n, "")} for n in range(1, 10)]

    return render_to_response(req, "training/index.html",
                              {"templates": all_tmpls})
Exemple #46
0
def patient(request, pk, template="weltel/patient.html"):
    patient = get_object_or_404(Patient, id=pk)
    context = {}
    context['patient'] = patient
    logs = get_history_for_patient(patient)
    context['history'] = paginated(request, logs)
    context['phone_numbers'] = [c.identity for c in patient.connections.all()]
    return render_to_response(request, template, context)
def participants(req):
    template_name="iavi/participants.html"
    user = req.user
    try:
        profile = user.get_profile()
        locations = profile.locations.all()
    except IaviProfile.DoesNotExist:
        # if they don't have a profile they aren't associated with
        # any locations and therefore can't view anything.  Only
        # exceptions are the superusers
        if user.is_superuser:
            locations = Location.objects.all()
        else:
            return render_to_response(req, "iavi/no_profile.html", {})
    
    reporters = IaviReporter.objects.filter(location__in=locations)
    return render_to_response(req, template_name, {"reporters" : reporters })
Exemple #48
0
def nurse(request, pk, template="weltel/nurse.html"):
    context = {}
    nurse = get_object_or_404(Nurse, id=pk)
    context['nurse'] = nurse
    logs = nurse.messages(order_by='-received')
    if logs:
        context['logs'] = paginated(request, logs)
    context['phone_numbers'] = [c.identity for c in nurse.connections.all()]
    return render_to_response(request, template, context)
Exemple #49
0
def site(request, pk, template="weltel/site.html"):
    context = {}
    site = get_object_or_404(Site, id=pk)
    patients = Patient.objects.filter(site=site)
    nurses = Nurse.objects.filter(sites=site)
    context['site'] = site
    context['patients'] = paginated(request, patients)
    context['nurses'] = paginated(request, nurses)
    return render_to_response(request, template, context)
def participant_summary(req, id):
    template_name="iavi/participant_summary.html"
    try:
        reporter = IaviReporter.objects.get(pk=id)
    except IaviReporter.NotFound:
        reporter = None 
    # todo - see if we wnat to put these back in
    kenya_reports = KenyaReport.objects.filter(reporter=reporter).order_by("-started")
    uganda_reports = UgandaReport.objects.filter(reporter=reporter).order_by("-started")
    return render_to_response(req, template_name, {"reporter" : reporter,"kenya_reports":kenya_reports, "uganda_reports":uganda_reports})
Exemple #51
0
def index(req):
    template_name = "logger/index.html"
    incoming = IncomingMessage.objects.order_by('received')
    outgoing = OutgoingMessage.objects.order_by('sent')
    all = []
    [all.append(msg) for msg in incoming]
    [all.append(msg) for msg in outgoing]
    # sort by date, descending
    all.sort(lambda x, y: cmp(y.date, x.date))
    return render_to_response(req, template_name, {"messages": all})
Exemple #52
0
def bednets_daily(req, locid):
    if not locid:
        locid = 1
    try:
        location = Location.objects.get(pk=locid)
        #_set_stock(location)
    except Location.DoesNotExist:
        location = None

    return render_to_response(req, "bednets/bednets_daily.html",
                              {'location': location})
Exemple #53
0
def index(request):
    '''
    Index view
    '''
    MESSAGES_PER_PAGE = 30

    # If it is a POST then they are responding to a message.
    # Don't allow sending if the user doesn't have the can_respond permission
    if request.method == 'POST' and\
       request.user.has_perm('logger_ng.can_respond'):

        for field, value in request.POST.iteritems():
            match = re.match(r'^respond_(?P<id>\d+)$', field)
            if match and len(value) > 1:
                pk = match.groupdict()['id']
                msg = get_object_or_404(LoggedMessage, pk=pk)
                respond_to_msg(msg, value)
        return redirect(index)

    # Don't exclude outgoing messages that are a response to another,
    # because they will be shown threaded beneath the original message
    msgs = LoggedMessage.objects.exclude(
        direction=LoggedMessage.DIRECTION_OUTGOING, response_to__isnull=False)

    # filter from form
    if request.method == 'GET':
        search = request.GET.get('logger_ng_search_box', '')
        msgs = msgs.filter(Q(identity__icontains=search) | \
                           Q(text__icontains=search) | \
                           Q(reporter__first_name__icontains=search) | \
                           Q(reporter__last_name__icontains=search))

    msgs = msgs.order_by('-date', 'direction')

    paginator = Paginator(msgs, MESSAGES_PER_PAGE)

    # Set the pagination page. Go to page 1 in the event there is no page
    # get variable or if it's something other than a number.
    try:
        page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1

    # Try to set the paginator object to the correct page. Set it to the
    # last page if there is some problem with it (too high, etc...)

    try:
        msgs = paginator.page(page)
    except (EmptyPage, InvalidPage):
        msgs = paginator.page(paginator.num_pages)

    ctx = locals()
    ctx['request'] = request
    return render_to_response(request, "logger_ng/index.html", ctx)
Exemple #54
0
def index_basic(req):

    template_name = "http/setphone.html"
    if req.method == 'POST':
        phone_number = ''
        if req.POST.has_key("phone_number"):
            phone_number = req.POST["phone_number"]
        if (len(phone_number) == 0):
            phone_number = random.randint(100000, 999999)
        return HttpResponseRedirect("/httpbasic/%s" % (phone_number))
        #return basic_ui(req, phone_number, True)
    return render_to_response(req, template_name, {})
def index(req):
    filters = {
        'period': default_log_period(req),
        'location': default_location(req),
        'province': default_province(req),
        'district': default_district(req)
    }
    template_name = "logger/index.html"
    lox, lxn = 0, location_name(req)
    if req.REQUEST.has_key('location') and req.REQUEST['location'] != '0':
        lox = int(req.REQUEST['location'])
        lxn = Location.objects.get(id=lox)
        lxn = lxn.name + ' ' + lxn.type.name + ', ' + lxn.parent.parent.name + ' ' + lxn.parent.parent.type.name + ', ' + lxn.parent.parent.parent.name + ' ' + lxn.parent.parent.parent.type.name
    rez = Location.objects.filter(**match_logs(req, filters))
    incoming = IncomingMessage.objects.filter(
        **match_received(req, filters)).order_by('-received')
    outgoing = OutgoingMessage.objects.filter(
        **match_sent(req, filters)).order_by('-sent')
    all = []
    rezf = rez.filter(**match_logs_fresher(req))
    for msg in incoming:
        if p_location(msg.identity) in rezf: all.append(msg)
    for msg in outgoing:
        if p_location(msg.identity) in rezf: all.append(msg)
    # sort by date, descending
    all.sort(lambda x, y: cmp(y.date, x.date))
    if req.REQUEST.has_key('csv'):
        htp = HttpResponse()
        htp['Content-Type'] = 'text/csv; encoding=%s' % (
            getdefaultencoding(), )
        wrt = csv.writer(htp, dialect='excel-tab')
        wrt.writerows(
            [['DATE', 'REPORTER', 'BACKEND', 'LOCATION', 'MESSAGE']] +
            [[r.date, r.identity, r.backend,
              p_location(r.identity), r.text] for r in all])

        return htp
    else:
        return render_to_response(
            req, template_name, {
                "messages": paginated(req, all, prefix="rep"),
                'rez': len(rez),
                'rezf': len(rezf),
                'usrloc': UserLocation.objects.get(user=req.user),
                'start_date': date.strftime(filters['period']['start'],
                                            '%d.%m.%Y'),
                'end_date': date.strftime(filters['period']['end'],
                                          '%d.%m.%Y'),
                'filters': filters,
                'locationname': lxn,
                'postqn': (req.get_full_path().split('?', 2) + [''])[1]
            })
def password_change(req, id):
    user_to_edit = User.objects.get(id=id)
    print req.user
    if req.method == 'POST': 
        password_form = AdminPasswordChangeForm(user_to_edit, req.POST)
        if password_form.is_valid():
            password_form.save()
            return HttpResponseRedirect('/iavi/users/%s/edit' % user_to_edit.id)
    else:
        password_form = AdminPasswordChangeForm(user_to_edit)
    template_name="iavi/password_change.html"
    return render_to_response(req, template_name, {"current_user" : user_to_edit,
                                                   "form" : password_form})
Exemple #57
0
def _old_index(req):
    # Reference to the old view of the old tables.
    # Ordinarily I would delete this, but this log is still 
    # around in several deployments
    template_name="logger/index.html"
    incoming = IncomingMessage.objects.order_by('received')
    outgoing = OutgoingMessage.objects.order_by('sent')
    all = []
    [ all.append(msg) for msg in incoming ]
    [ all.append(msg) for msg in outgoing]
    # sort by date, descending
    all.sort(lambda x, y: cmp(y.date, x.date))
    return render_to_response(req, template_name, { "messages": all })
Exemple #58
0
def patient_update(request, patid):
    patient = get_object_or_404(Registration, patient_id=patid)
    form = PatientForm(instance=patient)

    sent = SentNotif.objects.filter(patient_id=patient)
    patient.notifications = ', '.join(sorted(
        [s.day for s in sent])) if len(sent) > 0 else 'none sent yet'
    patient.post_op = (date.today() - patient.registered_on).days
    patient.contact_time = '%02d:%02d' % split_contact_time(
        patient.contact_time)

    return render_to_response(request, 'circumcision/patient.html', {
        'px': patient,
        'pat_form': form
    })
Exemple #59
0
def participant_delete(req, id):
    template_name = "iavi/participant_delete.html"
    num_reports = 0
    try:
        reporter = IaviReporter.objects.get(pk=id)
        num_reports = len(Report.objects.filter(reporter=reporter))
    except IaviReporter.DoesNotExist:
        reporter = None
    if req.method == 'POST':
        if reporter:
            reporter.delete()
        reporter = None
    return render_to_response(req, template_name, {
        "reporter": reporter,
        "num_reports": num_reports
    })
Exemple #60
0
def edit(request, pk, template="scheduler/edit.html"):
    context = {}
    schedule = get_object_or_404(EventSchedule, id=pk)
    if request.method == 'POST':
        form = ScheduleForm(request.POST, instance=schedule)
        if form.is_valid():
            form.save()
            context['status'] = _("Schedule '%(name)s' successfully updated" % \
                                {'name':schedule.callback} )
        else:
            context['errors'] = form.errors
    else:
        form = ScheduleForm(instance=schedule)
    context['form'] = form
    context['schedule'] = schedule
    return render_to_response(request, template, context)