source: asadb/forms/fysm-lint.py

fysm-4-1space-accessstablestagetest-hooks
Last change on this file was 5f467df, checked in by Alex Dehnert <adehnert@…>, 15 years ago

Display progress info in fysm-lint.py

  • Property mode set to 100755
File size: 5.4 KB
RevLine 
[07aa6da]1#!/usr/bin/python
2import sys
3import os
4import datetime
5
6from django.template import Context, Template
7from django.template.loader import get_template
8from django.core.urlresolvers import reverse
9from django.core.mail import EmailMessage
10
11if __name__ == '__main__':
12    cur_file = os.path.abspath(__file__)
13    django_dir = os.path.abspath(os.path.join(os.path.dirname(cur_file), '..'))
14    django_dir_parent = os.path.abspath(os.path.join(os.path.dirname(cur_file), '../..'))
15    sys.path.append(django_dir)
16    sys.path.append(django_dir_parent)
17    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
18
19import forms.models
20
21LEVEL_HIGH   = 'high'
22LEVEL_MEDIUM = 'medium'
23LEVEL_LOW    = 'low'
24
25def check_display_name(fysm):
26    if fysm.display_name[-5:] == ', MIT':
27        return {
28            'heading': 'Undesirable MIT ending to display name',
29            'body':    'It is rarely if ever desirable to end the display name of a group with ", MIT". You may wish to move it to the beginning, or simply remove it entirely.',
30            'level':    LEVEL_MEDIUM,
31        }
32    if ', ' in fysm.display_name:
33        return {
34            'heading': 'Potentially undesirable comma in display name',
35            'body':    'You have a comma in your display name. Frequently this is to move some common word to the end of the group name. You may wish to move such a common word to the front, or leave it out of your advertising entirely.',
36            'level':    LEVEL_LOW,
37        }
38
39def check_image_field(fysm, label, image):
40    good_ext = ['png', 'jpg', 'jpeg', 'gif', ]
41    ext = image.name.rsplit('.')[-1]
[3bccf0f]42    convert_msg = 'You should convert it to a PNG (or possibly GIF, if it is essentially all text; or JPEG, if it is mostly images).'
[07aa6da]43    if not image.name:
44        return {
45            'heading': 'No %s provided' % (label, ),
46            'body': 'You did not upload a %s. We strongly recommended uploading one, since it can help new students to recognize and understand your group.' % (label, ),
47            'level': LEVEL_MEDIUM,
48        }
49    if ext.lower() in ['tif', 'tiff', ]:
50        return {
51            'heading': 'Undesirable TIFF file submitted for %s' % (label, ),
[3bccf0f]52            'body':    ('You submitted a TIFF file for your %s. TIFF files are generally large and poorly supported by browsers. ' % (label, )) + convert_msg,
[07aa6da]53            'level':   LEVEL_HIGH,
54        }
55    if ext.lower() in ['bmp', ]:
56        return {
57            'heading': 'Undesirable BMP file submitted for %s' % (label, ),
[3bccf0f]58            'body':    ('You submitted a BMP file for your %s. BMP files are generally extremely large. ' % (label, )) + convert_msg,
[07aa6da]59            'level':   LEVEL_HIGH,
60        }
61    if not ext.lower() in good_ext:
62        print fysm.display_name, image.name, ext, label,
63        return {
64            'heading': ('Unusual file extension .%s submitted for %s' % (ext, label, )),
65            'body':    ('You submitted a .%s file for your %s. This is not one of the extensions that we see very often, which makes it seem somewhat likely to be a bad idea. ' % (ext, label, )) + convert_msg,
66            'level':   LEVEL_MEDIUM,
67        }
68
69checks = [
70    check_display_name,
71    lambda f: check_image_field(f, 'logo', f.logo,),
72    lambda f: check_image_field(f, 'slide', f.slide,),
73]
74
75def run_checks(obj):
76    results = []
77    for check in checks:
78        result = check(obj)
79        if result:
80            results.append(result)
81    return results
82
83def send_emails(objs, template, sender, bcc_recipient, subject_func, recipient_func, ):
84    for obj in objs:
85        results = run_checks(obj)
86        if len(results)>0:
87            subject = subject_func(obj)
88            ctx = Context({
89                'obj': obj,
90                'results': results,
91            })
92            body = tmpl.render(ctx)
93            email = EmailMessage(
94                subject=subject,
95                body=body,
96                from_email=sender,
97                to=recipient_func(obj),
98                bcc=[bcc_recipient,]
99            )
[5f467df]100            print subject, results
[07aa6da]101            email.send()
102
103if __name__ == '__main__':
104    from optparse import OptionParser
105    parser = OptionParser()
106    parser.add_option("-s", "--sender", dest="sender",
107                      help="send messages from EMAIL", metavar="EMAIL")
108    parser.add_option("-b", "--bcc-recipient", dest="bcc_recipient",
109                      help="BCC messages to EMAIL", metavar="EMAIL")
110    parser.add_option("-o", "--override-recipient", dest="override_recipient",
111                      help="send to EMAIL instead of group emails", metavar="EMAIL")
112    parser.add_option("-y", "--year", dest="year",
113                      help="process FYSM entries for YEAR", metavar="YEAR")
114    parser.set_defaults(
115        sender="asa-fysm@mit.edu",
116        bcc_recipient='asa-fysm-submissions@mit.edu',
117        override_recipient=None,
118        year=datetime.date.today().year,
119    )
120    (options, args) = parser.parse_args()
121
122    if options.override_recipient:
123        recipient_func = lambda fysm: [ options.override_recipient, ]
124    else:
125        recipient_func = lambda fysm: set([ fysm.contact_email, fysm.group.officer_email, ])
126    tmpl = get_template('fysm/lint_email.txt')
127    send_emails(
128        objs=forms.models.FYSM.objects.filter(year=int(options.year),),
129        template=tmpl,
130        sender=options.sender,
131        bcc_recipient=options.bcc_recipient,
132        subject_func=lambda f: "FYSM submission for %s" % (f.display_name, ),
133        recipient_func=recipient_func,
134    )
Note: See TracBrowser for help on using the repository browser.