Changeset feed77c


Ignore:
Timestamp:
Jul 9, 2014, 12:18:31 AM (10 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master
Children:
1a8ef12
Parents:
922e0e5
git-author:
Alex Dehnert <adehnert@…> (07/09/14 00:17:52)
git-committer:
Alex Dehnert <adehnert@…> (07/09/14 00:18:31)
Message:

RFP download/update process (and some tangential changes)

Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • INSTALL.rst

    rcabf7ac rfeed77c  
    3939    - ``ADMINS``
    4040    - Database configuration
    41     - ``SERVER_EMAIL``
     41    - ``SERVER_EMAIL`` and ``DEFAULT_FROM_EMAIL``
    4242    - ``SITE_URL_BASE`` -- full URL (including protocol and hostname; used in emails)
    4343    - Any other settings you want
  • client/downloader.py

    rf8a5e4b rfeed77c  
    3636
    3737def getLaTeX(br, latex_file, ):
    38     br.open(baseurl + 'vouchers/generate/')
     38    br.open(baseurl + 'vouchers/generate/vouchers.tex')
    3939    if br.viewing_html():
    4040        print br.response().get_data()
  • remit/settings/__init__.py

    r922e0e5 rfeed77c  
    1616)
    1717SERVER_EMAIL = 'remit-default-addr@mit.edu'
     18DEFAULT_FROM_EMAIL = 'remit-default-addr@mit.edu'
    1819
    1920GROUP_NAME = 'Remit'
  • remit/vouchers/admin.py

    r7ee21d8 rfeed77c  
    2828
    2929class RFPAdmin(admin.ModelAdmin):
    30     list_display = ('name', 'rfp_number', 'rfp_submit_time', 'payee_type', 'payee_name', 'item_amount', 'item_co', 'item_gl')
     30    list_display = ('pk', 'name', 'rfp_number', 'rfp_submit_time', 'payee_type', 'payee_name', 'item_amount', 'item_co', 'item_gl', 'documentation', )
     31    list_display_links = ('pk', 'name', )
    3132
    3233admin.site.register(vouchers.models.ReimbursementRequest, ReimbursementRequestAdmin)
  • remit/vouchers/models.py

    r922e0e5 rfeed77c  
    111111        rfp.item_amount = self.amount
    112112        rfp.item_desc = self.description
     113        rfp.documentation = self.documentation
    113114        rfp.save()
    114115        self.create_transfers()
     
    170171    processed = models.BooleanField(default=False)
    171172    process_time = models.DateTimeField(blank=True, null=True,)
    172     documentation = models.ForeignKey('Documentation', blank=True, null=True, )
     173    documentation = models.ForeignKey('Documentation', null=True, )
    173174
    174175    def mailing_addr_lines(self):
     
    226227
    227228    def fill_addr(self, address):
     229        if address == '':
     230            return
    228231        match = self.addr_regex.match(address)
    229232        assert match != None
  • remit/vouchers/urls.py

    r2b31097 rfeed77c  
    99    (r'submit/(?P<term>[\d\w-]+)/(?P<committee>[\d\w-]+)/(?P<recipient_type>mit|other)/', 'vouchers.views.submit_request', ),
    1010    url(r'review/(?P<object_id>\d+)/', 'vouchers.views.review_request', name='review_request', ),
    11     url(r'generate/', 'vouchers.views.generate_vouchers', name='generate_vouchers', ),
     11    url(r'^generate/vouchers.tex$', 'vouchers.views.generate_vouchers', name='generate_vouchers', ),
     12    url(r'^generate/rfps.csv$', 'vouchers.views.generate_rfp_specs', name='generate_rfp_specs', ),
    1213)
  • remit/vouchers/views.py

    r638b547 rfeed77c  
    88from django.shortcuts import render_to_response, get_object_or_404
    99from django.template import RequestContext
    10 from django.http import Http404, HttpResponseRedirect
     10from django.http import HttpResponse, Http404, HttpResponseRedirect, HttpResponseNotAllowed
    1111import django.forms
    1212from django.forms import ChoiceField, Form, ModelForm, ModelChoiceField
    1313from django.core.urlresolvers import reverse
    14 from django.core.mail import send_mail, mail_admins
     14from django.core.mail import send_mail, mail_admins, EmailMessage
    1515from django.db.models import Q
    1616from django.template import Context, Template
    1717from django.template.loader import get_template
    18 
     18from django.views.decorators.csrf import ensure_csrf_cookie
     19
     20import csv
     21import datetime
    1922import decimal
    2023
     
    347350    return response
    348351
     352# not a view
     353def generate_rfp_specs_download(http_request):
     354    # Download unprocessed RFPs
     355    rfps = vouchers.models.RFP.objects.all()
     356    rfps = rfps.filter(rfp_number=None)
     357    response = HttpResponse(mimetype='text/csv')
     358    writer = csv.writer(response)
     359    cols = ['id', 'name',
     360        'payee.mit', 'payee.name',
     361        'addr.street', 'addr.city', 'addr.state', 'addr.postal',
     362        'item.date', 'item.gl', 'item.co', 'item.amoumnt', 'item.desc',
     363        'documentation',
     364    ]
     365    writer.writerow(cols)
     366    for rfp in rfps:
     367        item_date = rfp.item_date.strftime("%m/%d/%Y")
     368        docs = http_request.build_absolute_uri(rfp.documentation.backing_file.url)
     369        writer.writerow((rfp.pk, rfp.name,
     370            rfp.payee_type == 'mit', rfp.payee_name,
     371            rfp.addr_street, rfp.addr_city, rfp.addr_state, rfp.addr_zip,
     372            item_date, rfp.item_gl, rfp.item_co, rfp.item_amount, rfp.item_desc,
     373            docs,
     374        ))
     375
     376    # Send mail
     377    tmpl = get_template('vouchers/emails/rfps_download.txt')
     378    ctx = Context({
     379        'user': http_request.user,
     380        'rfps': rfps,
     381    })
     382    body = tmpl.render(ctx)
     383    mail_admins(
     384        'RFPs downloaded: %d by %s' % (
     385            len(rfps),
     386            http_request.user,
     387        ),
     388        body,
     389    )
     390    return response
     391
     392def send_rfpized_email(rfp):
     393    # Should send mail to the submitter, including a coversheet to print and
     394    # give to SAO.  The attach() method of
     395    # https://docs.djangoproject.com/en/dev/topics/email/#emailmessage-objects
     396    # may be useful for the coversheet.
     397    tmpl = get_template('vouchers/emails/rfp_submitted.txt')
     398    ctx = Context({
     399        'rfp': rfp,
     400    })
     401    body = tmpl.render(ctx)
     402    to = [ rr.check_to_email for rr in rfp.reimbursementrequest_set.all() ]
     403    cc = [addr for name, addr in settings.ADMINS]
     404    mail = EmailMessage(
     405        subject="%sRFP submitted" % (settings.EMAIL_SUBJECT_PREFIX, ),
     406        body=body, to=to, cc=cc,
     407    )
     408    mail.send()
     409
     410# not a view
     411def generate_rfp_specs_results(http_request):
     412    reader = csv.DictReader(http_request)
     413    rfps = vouchers.models.RFP.objects
     414    time = datetime.datetime.now()
     415    results = []
     416    dups = 0
     417    for line in reader:
     418        print line
     419        rfp = rfps.get(pk=int(line['id']))
     420        if not rfp.rfp_number:
     421            rfp.rfp_number = line['rfp_number']
     422            rfp.rfp_submit_time = time
     423            rfp.save()
     424            msg = "updated"
     425            send_rfpized_email(rfp)
     426        else:
     427            msg = "additional number: %s" % (line['rfp_number'], )
     428            dups += 1
     429        results.append((rfp, msg))
     430
     431    # Send mail
     432    tmpl = get_template('vouchers/emails/rfps_updated.txt')
     433    ctx = Context({
     434        'user': http_request.user,
     435        'results': results,
     436        'dups': dups,
     437    })
     438    body = tmpl.render(ctx)
     439    mail_admins(
     440        'RFPs created: %d (%d duplicates) by %s' % (
     441            len(results), dups,
     442            http_request.user,
     443        ),
     444        body,
     445    )
     446    # For lack of something better to return, just print the email
     447    response = HttpResponse(body)
     448    return response
     449
     450#@user_passes_test(lambda u: u.has_perm('vouchers.generate_vouchers'))
     451@ensure_csrf_cookie
     452def generate_rfp_specs(http_request):
     453    if http_request.method == 'GET':
     454        return generate_rfp_specs_download(http_request)
     455    elif http_request.method == 'POST':
     456        # Upload RFP processing results
     457        return generate_rfp_specs_results(http_request)
     458    else:
     459        content = "Expected GET (download unprocessed RFPs) or POST (upload results)"
     460        return HttpResponseNotAllowed(["GET", "POST"], content=content)
     461
    349462def get_related_requests_qobj(user, ):
    350463    return Q(submitter=user.username) | Q(check_to_email=user.email)
Note: See TracChangeset for help on using the changeset viewer.