From d8dc064eb6bb2d7a35c203b1115ad0a34006623a Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Thu, 19 Jan 2017 17:55:59 +0200 Subject: [PATCH] Fix a bunch of PEP8 violations --- infoscreen/management/commands/hsl.py | 24 ++++++-- infoscreen/models.py | 55 +++++++++++------- infoscreen/tests.py | 2 +- infoscreen/views.py | 79 ++++++++++++++----------- members/models.py | 69 ++++++++++++---------- members/views.py | 84 +++++++++++++++++---------- sikweb/urls.py | 34 +++++------ 7 files changed, 208 insertions(+), 139 deletions(-) diff --git a/infoscreen/management/commands/hsl.py b/infoscreen/management/commands/hsl.py index e789e13..0b3ce94 100644 --- a/infoscreen/management/commands/hsl.py +++ b/infoscreen/management/commands/hsl.py @@ -4,15 +4,27 @@ from django.conf import settings from django.core.management.base import BaseCommand from infoscreen.models import HSLDataModel + class Command(BaseCommand): help = 'Loads HSL timetables and save to json file.' def handle(self, *args, **options): - src = urllib.request.urlopen("http://api.reittiopas.fi/hsl/prod/?userhash="+settings.HSL_USERHASH+"&request=stops_area¢er_coordinate=2545565,6675319").read().decode("utf-8") - data = json.loads(src); - arr=[] + location_coords = (2545565, 6675319) + src = urllib.request.urlopen( + "http://api.reittiopas.fi/hsl/prod/?userhash={}&request=stops_area¢er_coordinate={},{}" + .format(settings.HSL_USERHASH, location_coords[0], location_coords[1]))\ + .read().decode("utf-8") + + data = json.loads(src) + + arr = [] for element in data: - src = urllib.request.urlopen("http://api.reittiopas.fi/hsl/prod/?userhash="+settings.HSL_USERHASH+"&request=stop&code="+element['code']).read().decode("utf-8") + src = urllib.request.urlopen( + "http://api.reittiopas.fi/hsl/prod/?userhash={}&request=stop&code={}" + .format(settings.HSL_USERHASH, element['code'])).read().decode("utf-8") + parsed = json.loads(src)[0] - arr.append({"name":parsed['name_fi'],"lines":parsed['lines'],"dist":element['dist'],"departures":parsed['departures']}) - HSLDataModel.objects.create(data = json.dumps(arr)) + arr.append({"name": parsed['name_fi'], "lines": parsed['lines'], + "dist": element['dist'], "departures": parsed['departures']}) + + HSLDataModel.objects.create(data=json.dumps(arr)) diff --git a/infoscreen/models.py b/infoscreen/models.py index e118537..8a9d236 100644 --- a/infoscreen/models.py +++ b/infoscreen/models.py @@ -5,41 +5,44 @@ from datetime import datetime from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType + class InfoItem(models.Model): + class __meta__: abstract = True name = models.CharField(max_length=255) - expire_date = models.DateTimeField(blank=True,null=True) # None means never expiring item + expire_date = models.DateTimeField(blank=True, null=True) # None means never expiring item def get_template_url(self): raise NotImplementedError("inheriting classes must implement get_template_url") + @staticmethod def get_create_template_url(): raise NotImplementedError("inheriting classes must implement get_create_template_url") @classmethod - def create_from_dict(cls,d): + def create_from_dict(cls, d): item = cls() item.update_from_dict(d) return item - def update_from_dict(self,d): + def update_from_dict(self, d): try: expire_date = d.pop('expire_date', None) self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S") except: pass + dmap = { 'name': 'name', } - for k,v in d.items(): + for k, v in d.items(): try: - self.__setattr__(dmap[k],v) + self.__setattr__(dmap[k], v) except KeyError: pass self.save() - def get_dict(self): return { 'id': self.id, @@ -51,7 +54,7 @@ class InfoItem(models.Model): } def delete(self): - # since generic foreignkeys suck. delete infoitems pointing here manually + # since generic foreign keys suck, delete info items pointing here manually InfoInstance.objects.filter(item_id=self.id, item_type=ContentType.objects.get_for_model(self)).delete() super().delete() @@ -68,22 +71,26 @@ class InfoItem(models.Model): class ABBInfoItem(InfoItem): def get_template_url(self): return "/static/html/abb.html" + @staticmethod def get_create_template_url(): return "/static/html/abb_create.html" + class SossoInfoItem(InfoItem): def get_template_url(self): return "/static/html/sosso.html" + @staticmethod def get_create_template_url(): return "/static/html/sosso_create.html" + class ImageInfoItem(InfoItem): img = models.ImageField(upload_to="infoimages/") def get_template_url(self): - #get param to avoid angular from optimizing same template with different options + # get param to avoid angular from optimizing same template with different options return "/static/html/generic_image.html?img={}".format(self.name) @staticmethod @@ -95,13 +102,16 @@ class ImageInfoItem(InfoItem): d["options"] = {'img': self.img.url} return d + class HslInfoItem(InfoItem): def get_template_url(self): return "/static/html/hsl.html" + @staticmethod def get_create_template_url(): return "/static/html/hsl_create.html" + class ExternalImageInfoItem(InfoItem): url = models.TextField() @@ -118,12 +128,12 @@ class ExternalImageInfoItem(InfoItem): return d @classmethod - def create_from_dict(cls,d): + def create_from_dict(cls, d): item = cls() item.update_from_dict(d) return item - def update_from_dict(self,d): + def update_from_dict(self, d): try: expire_date = d.pop('expire_date', None) self.expire_date = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S") @@ -134,23 +144,24 @@ class ExternalImageInfoItem(InfoItem): 'name': 'name', 'url': 'url', } - for k,v in d.items(): + for k, v in d.items(): try: - self.__setattr__(dmap[k],v) + self.__setattr__(dmap[k], v) except KeyError: pass self.save() + class InfoInstance(models.Model): rotation = models.ForeignKey('Rotation', related_name='instances') - duration = models.FloatField(default=15.0) # seconds - # generic relation to somekind of InfoItem + duration = models.FloatField(default=15.0) # seconds + # generic relation to some kind of InfoItem item_id = models.PositiveIntegerField() - item_type = models.ForeignKey(ContentType,on_delete=models.CASCADE) - item = GenericForeignKey('item_type','item_id') + item_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + item = GenericForeignKey('item_type', 'item_id') @classmethod - def create_from_dict(cls,d): + def create_from_dict(cls, d): try: rotation = Rotation.objects.get(pk=int(d["rotation_id"])) ct = ContentType.objects.get_for_id(int(d["item_type"])) @@ -169,13 +180,15 @@ class InfoInstance(models.Model): def get_dict(self): return { - 'id':self.id, + 'id': self.id, 'item': self.item.get_dict(), 'duration': self.duration, } + def __str__(self): return "{}: {} ({}s)".format(self.rotation.name, self.item.name, self.duration) + class Rotation(models.Model): name = models.CharField(max_length=255) @@ -184,13 +197,14 @@ class Rotation(models.Model): now = timezone.now() instances = self.instances.all() filtered = filter(lambda i: (i.item.expire_date or now) >= now, list(instances)) - instance_list = list(map(lambda i:i.get_dict(), filtered)) + instance_list = list(map(lambda i: i.get_dict(), filtered)) return { 'id':self.id, 'name': self.name, 'instances': instance_list, } + def get_list(self): return { 'id':self.id, @@ -200,6 +214,7 @@ class Rotation(models.Model): def __str__(self): return self.name + class ImageUploadForm(forms.Form): ''' Form used to handle imageuploads to @@ -208,6 +223,6 @@ class ImageUploadForm(forms.Form): name = forms.CharField() image = forms.ImageField() + class HSLDataModel(models.Model): data = models.TextField(default="", editable=False) - diff --git a/infoscreen/tests.py b/infoscreen/tests.py index 9c15d22..107f178 100644 --- a/infoscreen/tests.py +++ b/infoscreen/tests.py @@ -35,6 +35,6 @@ class InfoscreenTestCase(TestCase): ''' def test_get_infoitems(self): req = HttpRequest() - resp = infoscreen.views.infoItems(req) + resp = infoscreen.views.info_items(req) content = resp.content.decode('utf-8') self.assertTrue(len(content) > 0) diff --git a/infoscreen/views.py b/infoscreen/views.py index 0aff4d4..2d7bd8f 100644 --- a/infoscreen/views.py +++ b/infoscreen/views.py @@ -3,23 +3,24 @@ from django.http import HttpResponse,HttpResponseBadRequest from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.http import require_http_methods from django.contrib.contenttypes.models import ContentType -from django.contrib.auth.decorators import permission_required -from django.utils import timezone +from django.contrib.auth.decorators import permission_required from infoscreen.models import Rotation, InfoItem, InfoInstance from infoscreen.models import ABBInfoItem, ExternalImageInfoItem, ImageInfoItem, SossoInfoItem, HslInfoItem from infoscreen.models import ImageUploadForm from infoscreen.models import HSLDataModel -from datetime import datetime, timedelta import json import logging -def index(request,idx, *args, **kwargs): - return render(request, 'infoscreen_index.html',{'rotation':idx}) + +def index(request, idx, *args, **kwargs): + return render(request, 'infoscreen_index.html', {'rotation': idx}) + @permission_required('infoscreen.change_infoinstance', login_url='/login') def admin(request, *args, **kwargs): - return render(request,'infoscreen_admin.html',{}) + return render(request, 'infoscreen_admin.html', {}) + def default(request,*args,**kwargs): try: @@ -28,6 +29,7 @@ def default(request,*args,**kwargs): first = 0 return index(request,first ,*args, **kwargs) + @require_http_methods(["GET"]) def rotation(request, idx, *args, **kwargs): try: @@ -40,11 +42,11 @@ def rotation(request, idx, *args, **kwargs): return HttpResponse(json.dumps(rotation.get_dict())) -def itemCreator(model): +def create_item_generator(model): @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('infoscreen.change_infoinstance', login_url='/login') - def createItem(request,*args, **kwargs): + def create_item(request, *args, **kwargs): try: data = json.loads(request.body.decode("utf-8")) except ValueError: @@ -54,13 +56,14 @@ def itemCreator(model): return HttpResponse('{"status":"success"}') except RuntimeError as e: return HttpResponseBadRequest('{"status":"failure","error":"{}"}'.format(str(e))) - return createItem + return create_item -def itemDeletor(model): + +def delete_item_generator(model): @ensure_csrf_cookie @require_http_methods(["DELETE"]) @permission_required('infoscreen.change_infoinstance', login_url='/login') - def deleteItem(request,*args, **kwargs): + def delete_item(request, *args, **kwargs): idx = kwargs.pop("idx", 0) try: item = model.objects.get(pk=idx) @@ -75,13 +78,14 @@ def itemDeletor(model): resp = HttpResponse('{"error" : "could not delete item"}') resp.status_code = 500 return resp - return deleteItem + return delete_item + # due to model structure this is little complicated @ensure_csrf_cookie @permission_required('infoscreen.change_infoinstance', login_url='/login') @require_http_methods(["DELETE"]) -def deleteInfoItem(request,*args, **kwargs): +def delete_info_item(request, *args, **kwargs): type_id = kwargs.pop("type_id", 0) idx = kwargs.pop("idx", 0) if True: @@ -99,23 +103,26 @@ def deleteInfoItem(request,*args, **kwargs): resp.status_code = 500 return resp -@require_http_methods(["GET"]) -def rotations(request,*args,**kwargs): - rotations = list(map(lambda r: r.get_list(),Rotation.objects.all())) - return HttpResponse(json.dumps(rotations)) @require_http_methods(["GET"]) -def infoTypes(request, *args, **kwargs): +def rotations(request, *args, **kwargs): + rotations = list(map(lambda r: r.get_list(), Rotation.objects.all())) + return HttpResponse(json.dumps(rotations)) + + +@require_http_methods(["GET"]) +def info_types(request, *args, **kwargs): types = [] classes = InfoItem.get_subclasses() for c in classes: types.append({ - "name":c.__name__, - "create_template_url":c.get_create_template_url(), + "name": c.__name__, + "create_template_url": c.get_create_template_url(), }) return HttpResponse(json.dumps(types)) -def infoItems(request, *args, **kwargs): + +def info_items(request, *args, **kwargs): items = [] classes = InfoItem.get_subclasses() for c in classes: @@ -123,23 +130,26 @@ def infoItems(request, *args, **kwargs): items.append(i.get_dict()) return HttpResponse(json.dumps(items)) + @require_http_methods(["POST"]) @ensure_csrf_cookie @permission_required('infoscreen.change_infoinstance', login_url='/login') -def createImageItem(request, *args, **kwargs): +def create_image_item(request, *args, **kwargs): form = ImageUploadForm(request.POST,request.FILES) if not form.is_valid(): - return HttpResponseBadRequest('{"status":"failure","error":"invalid data supplied"}') + return HttpResponseBadRequest('{"status": "failure",' + '"error": "invalid data supplied"}') img = form.cleaned_data['image'] name = form.cleaned_data['name'] ImageInfoItem.objects.create(img=img, name=name) return HttpResponse('{"status":"success"}') + @require_http_methods(["POST"]) @ensure_csrf_cookie @permission_required('infoscreen.add_rotation', login_url='/login') -def createRotation(request, *args, **kwargs): +def create_rotation(request, *args, **kwargs): try: data = json.loads(request.body.decode("utf-8")) except: @@ -154,10 +164,11 @@ def createRotation(request, *args, **kwargs): return resp + @require_http_methods(["DELETE"]) @ensure_csrf_cookie @permission_required('infoscreen.delete_rotation', login_url='/login') -def deleteRotation(request, *args, **kwargs): +def delete_rotation(request, *args, **kwargs): id = kwargs.pop("id", 0) logging.warning("Deleting rotation with id={}".format(id)) @@ -170,16 +181,18 @@ def deleteRotation(request, *args, **kwargs): return resp + @require_http_methods(["GET"]) def CurrentHSLView(request, *args, **kwargs): data = HSLDataModel.objects.all() - if(len(data)<1): - return HttpResponse('{"error" : "Could not find timetables from database."}',status=500) + if len(data) < 1: + return HttpResponse('{"error" : "Could not find timetables from database."}', status=500) + return HttpResponse(data[len(data)-1].data, status=200) -createInstance = itemCreator(InfoInstance) -deleteInstance = itemDeletor(InfoInstance) -createABBItem = itemCreator(ABBInfoItem) -createSossoItem = itemCreator(SossoInfoItem) -createHslItem = itemCreator(HslInfoItem) -createExternalImageInfoItem = itemCreator(ExternalImageInfoItem) +createInstance = create_item_generator(InfoInstance) +deleteInstance = delete_item_generator(InfoInstance) +createABBItem = create_item_generator(ABBInfoItem) +createSossoItem = create_item_generator(SossoInfoItem) +createHslItem = create_item_generator(HslInfoItem) +createExternalImageInfoItem = create_item_generator(ExternalImageInfoItem) diff --git a/members/models.py b/members/models.py index bb23085..aa52019 100644 --- a/members/models.py +++ b/members/models.py @@ -4,6 +4,7 @@ from datetime import datetime from io import StringIO import csv + class Member(models.Model): ''' Member model represets one member on the registry @@ -12,7 +13,7 @@ class Member(models.Model): first_name = models.CharField(max_length=127) last_name = models.CharField(max_length=127) email = models.EmailField() - POR = models.CharField(max_length=255) # place of residence + POR = models.CharField(max_length=255) # place of residence AYY = models.BooleanField(default=False) jas = models.BooleanField(default=False) created = models.DateTimeField(default=timezone.now) @@ -20,59 +21,64 @@ class Member(models.Model): def get_dict(self): return { - 'id':self.id, - 'first_name':self.first_name, - 'last_name':self.last_name, - 'email':self.email, - 'POR':self.POR, - 'AYY':self.AYY, - 'jas':self.jas, - 'created':date2str(self.created), - 'paid':date2str(self.paid), + 'id': self.id, + 'first_name': self.first_name, + 'last_name': self.last_name, + 'email': self.email, + 'POR': self.POR, + 'AYY': self.AYY, + 'jas': self.jas, + 'created': date2str(self.created), + 'paid': date2str(self.paid), } @classmethod - def create_from_dict(cls,d): + def create_from_dict(cls, d): mbr = cls() mbr.update_from_dict(d) return mbr - def update_from_dict(self,d): + def update_from_dict(self, d): dmap = { - 'first_name': reverseMap('first_name'), - 'last_name': reverseMap('last_name'), - 'email': reverseMap('email'), - 'POR': reverseMap('POR'), - 'AYY': reverseMap('AYY'), - 'jas': reverseMap('jas'), - 'paid': reverseMap('paid',str2date), + 'first_name': reverse_map('first_name'), + 'last_name': reverse_map('last_name'), + 'email': reverse_map('email'), + 'POR': reverse_map('POR'), + 'AYY': reverse_map('AYY'), + 'jas': reverse_map('jas'), + 'paid': reverse_map('paid', str2date), } - for k,v in d.items(): + for k, v in d.items(): try: - self.__setattr__(dmap[k].key,dmap[k].parser(v)) + self.__setattr__(dmap[k].key, dmap[k].parser(v)) except KeyError: pass self.save() + @classmethod def import_csv(cls, csv_string): reader = csv.reader(StringIO(csv_string.strip())) - response = {"status": "success", "errors": []}; + response = {"status": "success", "errors": []} try: data = list(reader) except ValueError: return {"status": "failure", "errors": ["could not parse csv file"]} + + affirmative_answers = ['yes', 'y', '1', 'true', "kyllä", "khyl"] for row in data: + try: obj = cls.objects.create( first_name=row[0], last_name=row[1], email=row[2], POR=row[3], - AYY=row[4].lower() in ['yes','y','1','true',"kyllä", "khyl"], - jas=row[5].lower() in ['yes','y','1','true',"kyllä", "khyl"], - paid = timezone.now() + AYY=row[4].lower() in affirmative_answers, + jas=row[5].lower() in affirmative_answers, + paid=timezone.now() ) print("added obj {}".format(obj)) + except: response["status"] = "failure" response["errors"].append("failure adding item {}".format(", ".join(row))) @@ -82,15 +88,17 @@ class Member(models.Model): def __str__(self): return "{} {}".format(self.first_name, self.last_name) + class MemberRequest(models.Model): member = models.ForeignKey(Member) def get_dict(self): return { - 'id': self.id, - 'member': self.member.get_dict(), + 'id': self.id, + 'member': self.member.get_dict(), } + def date2str(date): ''' Convert date to a standard date string @@ -99,11 +107,12 @@ def date2str(date): return None return date.strftime("%Y-%m-%d %H:%M:%S") + def str2date(s): return datetime.strptime(s,"%Y-%m-%d %H:%M:%S") -class reverseMap: - def __init__(self, key, parser=lambda x:x): + +class reverse_map: + def __init__(self, key, parser=lambda x: x): self.key = key self.parser = parser - diff --git a/members/views.py b/members/views.py index 4450e9b..7444e59 100644 --- a/members/views.py +++ b/members/views.py @@ -11,13 +11,13 @@ import requests from django.conf import settings import logging -#Logger function, you can use the same idea when implementing other loggers to other apps +# Logger function, you can use the same idea when implementing other loggers to other apps memberlogger = logging.getLogger(__name__) logging.basicConfig(format='[%(levelname)s]%(asctime)s %(message)s', level=settings.LOGGERLEVEL, filename=settings.LOGPATH) -#function to validate reCaptcha -def validateReCaptcha(response): +# function to validate reCaptcha +def validate_recaptcha(response): values = { 'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY, 'response': response, @@ -31,43 +31,49 @@ def validateReCaptcha(response): return False return True -#def sendmail(subject, message): - #send_mail( - # subject, - # message, - # 'no-reply@sahkoinsinoorikilta.fi', - # ['viestintamestari@sahkoinsinoorikilta.fi'], - # fail_silently=False - #) + +def send_mail_wrapper(subject, message): + send_mail( + subject, + message, + 'no-reply@sahkoinsinoorikilta.fi', + ['viestintamestari@sahkoinsinoorikilta.fi'], + fail_silently=False + ) + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def index(request, *args, **kwargs): - return render(request, 'members_index.html',{}) + return render(request, 'members_index.html', {}) + @ensure_csrf_cookie -def applicationindex(request, *args, **kwargs): - return render(request, 'application_index.html',{}) +def application_index(request, *args, **kwargs): + return render(request, 'application_index.html', {}) + @ensure_csrf_cookie -def applicationSuccessIndex(request, *args, **kwargs): - return render(request, 'application_success.html',{}) +def application_success_index(request, *args, **kwargs): + return render(request, 'application_success.html', {}) + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def members(request, *args, **kwargs): - mems = list(map(lambda m: m.get_dict(),Member.objects.all())) + mems = list(map(lambda m: m.get_dict(), Member.objects.all())) return HttpResponse(json.dumps(mems)) + @ensure_csrf_cookie -@require_http_methods(["GET", "POST", "DELETE","PUT"]) +@require_http_methods(["GET", "POST", "DELETE", "PUT"]) @permission_required('members.change_member', login_url='/login') -def member(request,*args, **kwargs): +def member(request, *args, **kwargs): # get, put and delete together since all operate on existing objects - if request.method in ['GET','PUT', 'DELETE']: + if request.method in ['GET', 'PUT', 'DELETE']: # get object by id or give 404 idx = kwargs.pop("idx", None) @@ -106,6 +112,7 @@ def member(request,*args, **kwargs): except ValueError: return HttpResponseBadRequest('{"error" : "Invalid parameters supplied"}') + @ensure_csrf_cookie @require_http_methods(["POST"]) @permission_required('members.change_member', login_url='/login') @@ -117,11 +124,12 @@ def csv_import(request, *args, **kwargs): resp.status_code = 400 return resp + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def member_requests(request, *args, **kwargs): - reqs = list(map(lambda r: r.get_dict(),MemberRequest.objects.all())) + reqs = list(map(lambda r: r.get_dict(), MemberRequest.objects.all())) return HttpResponse(json.dumps(reqs)) @@ -129,16 +137,18 @@ def member_requests(request, *args, **kwargs): def new_member_request(request, *args, **kwargs): try: data = json.loads(request.body.decode("utf-8")) - #get captcha response from member + # get captcha response from member captcha = data.pop("reCaptchaResponse", "") - #send response to google and check it out - captcha_ok = validateReCaptcha(captcha) - #if not ok, inform user + # send response to google and check it out + captcha_ok = validate_recaptcha(captcha) + # if not ok, inform user if not captcha_ok: - return HttpResponseBadRequest('{"error" : "Captcha not ok. Please try again."}') - #if ok continue + return HttpResponseBadRequest('{"error": "Captcha not ok. Please try again."}') + # if ok continue mem = Member.create_from_dict(data) req = MemberRequest.objects.create(member=mem) + + # Build the email body subject = 'New application' message = 'You have new application\r\n' message += 'Member info:\r\n' @@ -150,13 +160,18 @@ def new_member_request(request, *args, **kwargs): message += 'To mail list: ' + str(mem.jas) + '\r\n' message += 'Created: ' + mem.created.isoformat(' ') + '\r\n' message += 'Please go to the http://sika.sahkoinsinoorikilta.fi/members/ and do something about it!\r\n' - #sendmail(subject, message) + + # TODO: send mail when application is ready + # send_mail_wrapper(subject, message) + return HttpResponse(json.dumps(mem.get_dict())) + except ValueError: return HttpResponseBadRequest('{"error" : "Invalid parameters supplied"}') except TimeoutError: return HttpResponseBadRequest('{"error" : "Much error, no connection"}') + @ensure_csrf_cookie @require_http_methods(["GET", "POST", "DELETE"]) @permission_required('members.change_member', login_url='/login') @@ -171,23 +186,28 @@ def handle_mem_request(request, idx, *args, **kwargs): return HttpResponse(json.dumps(req.get_dict())) elif request.method == 'DELETE': req.member.delete() - else: # method == POST because other aren't allowed here + else: # method == POST because other aren't allowed here req.delete() return HttpResponse('{"status":"success"}') + @ensure_csrf_cookie @require_http_methods(["GET"]) @permission_required('members.change_member', login_url='/login') def export_csv(request, *args, **kwargs): import csv + response = HttpResponse() response['Content-type'] = 'text/csv' response['Accept'] = 'text/csv' response['Content-Disposition'] = 'filename; filename=members.csv' writer = csv.writer(response, csv.excel) - response.write(u'\ufeff'.encode('utf8')) # BOM (optional...Excel needs it to open UTF-8 file properly) + response.write(u'\ufeff'.encode('utf8')) # BOM (optional...Excel needs it to open UTF-8 file properly) for obj in Member.objects.all(): data = obj.get_dict() - field_list = [str(data['id']), str(data['first_name']), str(data['last_name']), str(data['email']), str(data['POR']), str(data['AYY']), str(data['jas']), str(data['created']), str(data['paid'])] + field_list = map(lambda s: str(data[s]), + ['id', 'first_name', 'last_name', 'email', 'POR', 'AYY', 'jas', 'created', 'paid']) + writer.writerow(field_list) - return response + + return response \ No newline at end of file diff --git a/sikweb/urls.py b/sikweb/urls.py index d5655ec..4e54788 100644 --- a/sikweb/urls.py +++ b/sikweb/urls.py @@ -35,23 +35,23 @@ from infoscreen.views import index as infoindex from infoscreen.views import default as infodefault from infoscreen.views import rotation from infoscreen.views import rotations -from infoscreen.views import infoItems -from infoscreen.views import infoTypes -from infoscreen.views import deleteInfoItem +from infoscreen.views import info_items +from infoscreen.views import info_types +from infoscreen.views import delete_info_item from infoscreen.views import createInstance as createInfoInstance from infoscreen.views import deleteInstance as deleteInfoInstance from infoscreen.views import createExternalImageInfoItem -from infoscreen.views import createImageItem +from infoscreen.views import create_image_item from infoscreen.views import createABBItem from infoscreen.views import createSossoItem from infoscreen.views import createHslItem -from infoscreen.views import createRotation -from infoscreen.views import deleteRotation +from infoscreen.views import create_rotation +from infoscreen.views import delete_rotation from infoscreen.views import CurrentHSLView from infoscreen.views import admin as infoscreen_admin #application -from members.views import applicationindex -from members.views import applicationSuccessIndex +from members.views import application_index +from members.views import application_success_index urlpatterns = [ # main @@ -74,23 +74,23 @@ urlpatterns = [ #infoscreen url(r'^infoscreen/$', infodefault), url(r'^infoscreen/(?P\d+)$', infoindex), - url(r'^infoscreen/items$', infoItems), + url(r'^infoscreen/items$', info_items), url(r'^infoscreen/rotation/(?P\d+)$', rotation), url(r'^infoscreen/rotations$', rotations), url(r'^infoscreen/instance$', createInfoInstance), url(r'^infoscreen/instance/(?P\d+)$', deleteInfoInstance), - url(r'^infoscreen/types$', infoTypes), - url(r'^infoscreen/delete_item/(?P\d+)/(?P\d+)$', deleteInfoItem), + url(r'^infoscreen/types$', info_types), + url(r'^infoscreen/delete_item/(?P\d+)/(?P\d+)$', delete_info_item), url(r'^infoscreen/create_external_image$', createExternalImageInfoItem), - url(r'^infoscreen/create_image$', createImageItem), + url(r'^infoscreen/create_image$', create_image_item), url(r'^infoscreen/create_abbitem$', createABBItem), url(r'^infoscreen/create_sossoitem$', createSossoItem), url(r'^infoscreen/create_hslitem$', createHslItem), url(r'^infoscreen/admin$', infoscreen_admin), - url(r'^infoscreen/create_rotation$', createRotation), - url(r'^infoscreen/delete_rotation/(?P\d+)$', deleteRotation), - url(r'^infoscreen/hsl_data$',CurrentHSLView), + url(r'^infoscreen/create_rotation$', create_rotation), + url(r'^infoscreen/delete_rotation/(?P\d+)$', delete_rotation), + url(r'^infoscreen/hsl_data$', CurrentHSLView), #application - url(r'^application/$', applicationindex), - url(r'^application/success$', applicationSuccessIndex), + url(r'^application/$', application_index), + url(r'^application/success$', application_success_index), ]