Advertisement
Guest User

Untitled

a guest
Jul 25th, 2018
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.45 KB | None | 0 0
  1. # views.py
  2.  
  3. # Painted Rock Hunt Game's views
  4.  
  5.  
  6. import logging, re, datetime
  7. from main.models import UserProfile, AnonSMSUser, Ward, Gets, PostalAddress
  8. from django.http import HttpResponse
  9. from django.core.exceptions import ObjectDoesNotExist
  10. from django.shortcuts import render_to_response
  11. from django.contrib.auth.decorators import login_required
  12. from django.contrib.auth.models import User
  13.  
  14. def index(request):
  15.     # We'll make a context to throw some variables in so the template
  16.     # has some variables left. It's gonna look like this when it's done:
  17.     #  context = {
  18.   #    "userlist": [
  19.   #      {
  20.   #        "user": <username>,
  21.   #        "wards": [
  22.   #          (<ward num>, <ward got>)
  23.   #          ...
  24.   #        ],
  25.   #        "won": <won>
  26.   #      },
  27.   #      ...
  28.   #    ]
  29.   #  }
  30.     # For Ward Panels' info and milestone tracking
  31.     context = { "userlist": [] }
  32.     if request.user and request.user.is_authenticated():
  33.         context['user'] = request.user
  34.         # save some stuff about the current user
  35.         current_user ={}
  36.         current_user['user'] = request.user
  37.  
  38.         current_user['wards'] = []
  39.         curr_wards = Gets.objects.filter(user=request.user.get_profile().pk)
  40.         curr_wards = map(lambda x: x.ward, curr_wards)
  41.         for ward in curr_wards:
  42.             current_user['wards'].append((int(ward.ward_number), True))
  43.         # lets figure out which wards the user hasn't gotten
  44.         got_wards = map(lambda x: x[0], current_user['wards'])
  45.         for i in range(1, 9):
  46.             if i not in got_wards:
  47.                 current_user['wards'].append((i, False))
  48.         # clear dups
  49.         current_user['wards'] = list(set(current_user['wards']))
  50.         # sort that shit.
  51.         current_user['wards'].sort()
  52.  
  53.         # see if the current user has won
  54.         current_user['won'] = request.user.get_profile().won
  55.  
  56.         # print got_wards
  57.         if len(set(got_wards)) == 8:
  58.             current_user['got_all'] = True
  59.            
  60.             # print "current_user.won: " + str(current_user["won"])
  61.  
  62.             # create the form to guess secret word
  63.             winform = WinningForm()
  64.             context['winform'] = winform
  65.             # create the address form in case guess is correct
  66.             addrform = AddressForm()
  67.             context['addrform'] = addrform
  68.  
  69.             # get current user's postal address, if any
  70.             try:
  71.                 current_user['addr'] = PostalAddress.objects.get(player=request.user.id)
  72.  
  73.                 # print current_user['addr'].postal_code
  74.  
  75.             except Exception e:
  76.                 wwwlogger.debug(e)
  77.                 current_user['addr'] = None
  78.                 # print "current_user['addr']: None"
  79.  
  80.         else:
  81.             current_user['got_all'] = False
  82.  
  83.         # print current_user
  84.  
  85.         context['current_user'] = current_user
  86.  
  87.     # ---------------- Populate the PLAYER ROLL ----------------------------------
  88.     # First thing we need to do is get a list of the users. We'll do
  89.     # this by making a query set and grabbing the
  90.     #   last (note the minus before field name) 10 by id for the Player Roll).
  91.     userlist = User.objects.all().order_by('-id')[:10]
  92.    
  93.     # this next query crashed Postgres because of order_by('?') which is resource intensive at best
  94.     # userlist = User.objects.all().order_by('?')[:10]
  95.    
  96.     users = []
  97.     for user in userlist:
  98.  
  99.         # this dictionary will be added to the userlist queryset
  100.         user_obj = {}
  101.  
  102.         # this takes care of name
  103.         user_obj['name'] =  user.username
  104.  
  105.         # let's make an empty wards list
  106.         user_obj['wards'] = []
  107.  
  108.         # get user's "won" state
  109.         user_obj['won'] = user.get_profile().won
  110.         # print "user_obj[won] = " + str(user_obj['won'])
  111.  
  112.         # let's get all of a user's wards and throw them into the list
  113.         wards = Gets.objects.filter(user = user.get_profile().pk)
  114.         wards = map(lambda x: x.ward, wards)
  115.         for ward in wards:
  116.             user_obj['wards'].append((int(ward.ward_number), True))
  117.  
  118.         # lets figure out which wards the user hasn't gotten
  119.         got_wards = map(lambda x: x[0], user_obj['wards'])
  120.         for i in range(1, 9):
  121.             if i not in got_wards:
  122.                 user_obj['wards'].append((i, False))
  123.         # clear dups
  124.         user_obj['wards'] = list(set(user_obj['wards']))
  125.         # sort that shit.
  126.         user_obj['wards'].sort()
  127.         # and figure out if the user has got all
  128.         if len(set(got_wards)) == 8:
  129.             user_obj['got_all'] = True # was user_obj['won']
  130.         else:
  131.             user_obj['got_all'] = False # was user_obj['won']
  132.         # add this user object to the userlist
  133.         users.append(user_obj)
  134.         # print users
  135.     context['userlist'] = users
  136.  
  137.     # now lets add some ward form stuff to the index
  138.     form = WardGetForm()
  139.     context['form'] = form
  140.  
  141.     return render_to_response('index.html', context, context_instance=RequestContext(request))
  142.  
  143.  
  144.  
  145. # Brad's fetch latest version of player roll for the sidebar
  146. def poll_request(request):
  147.     if request.POST and request.is_ajax():
  148.         context = {}
  149.         newest_user = UserProfile.objects.all().order_by('date')[0]
  150.         # figure out how to get the username and wards and wins in that context thing
  151.         context['user'] = newest_user.user
  152.         context['won'] = newest_user.won
  153.         # that last one you gotta figure out
  154.         render_to_response("li_snippet.html", context) 
  155.  
  156. # Brad's 2nd fetch latest version of player roll for the sidebar
  157. def player_roll(request):
  158.     user_list = []
  159.     for user in UserProfile.objects.all():
  160.         gets = Gets.objects.all().filter(user=UserProfile.pk)
  161.         user_obj = {}
  162.         for ward in gets:
  163.             user_obj["ward"+ward.ward] = True
  164.         if len(gets) == 8:
  165.                 user_obj["won"] = True
  166.         user_obj["name"] = user.name
  167.         user_list.append(user_obj)
  168.     render_to_response("that template", {"userlist": user_list})
  169.  
  170. def about(request):
  171.     return render_to_response('about.html')
  172.  
  173. def news(request):
  174.     return render_to_response('news.html')
  175.  
  176. def howto(request):
  177.     return render_to_response('howto.html')
  178.  
  179. from django.contrib.auth.forms import UserCreationForm
  180. from django.forms import EmailField
  181. from django.template import RequestContext
  182. from django.http import HttpResponseRedirect
  183. from django.contrib.auth import authenticate, login
  184.  
  185. class PrhgUserCreationForm(UserCreationForm):
  186.     email = EmailField(label="Email")
  187.  
  188.     class Meta:
  189.         model = User
  190.         fields = ('username', 'email')
  191.  
  192.     def save(self, commit=True):
  193.         user = super(PrhgUserCreationForm, self).save(commit=False)
  194.         user.email = self.cleaned_data["email"]
  195.         if commit:
  196.             user.save()
  197.         return user
  198.  
  199. def register(request):
  200.     if request.method == 'POST': # If the form has been submitted...
  201.         form = PrhgUserCreationForm(request.POST) # A form bound to the POST data
  202.         if form.is_valid(): # All validation rules pass
  203.             form.save()
  204.             user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password2'])
  205.             login(request, user)
  206.             return HttpResponseRedirect('/') # Redirect after POST
  207.     else:
  208.         form = PrhgUserCreationForm() # An unbound form
  209.         return render_to_response('register.html', {'form': form,}, context_instance=RequestContext(request))
  210.  
  211.  
  212. from django.http import HttpResponseForbidden
  213. from django.views.decorators.csrf import csrf_exempt
  214. from models import UserProfile, Gets
  215. import re
  216.  
  217. def SmsResponse(body):
  218.     return HttpResponse('<?xml version="1.0" encoding="UTF-8"?><Response><Sms>' + body + '</Sms></Response>')
  219.  
  220. @csrf_exempt
  221. def smsplay(request):
  222.     if request.method != "POST":
  223.         return HttpResponseForbidden("Can't get this")
  224.  
  225.     # The 34 character id of the Account this message is associated with.
  226.     account_sid = request.POST.get('AccountSid')           
  227.     # A 34 character unique identifier for the message.
  228.     sms_sid = request.POST.get('SmsSid')
  229.     # The phone number that sent this message.
  230.     from_phone = str(request.POST.get('From')) # Fomatted in E.164 format. E.g., +19991118888
  231.     default_pw = from_phone[2:] # To store an sms user's default password in a form s/he will remember (2223334444)
  232.     from_phone = from_phone[2:5] + '-' + from_phone[5:8] + '-' + from_phone[8:]
  233.     # The phone number of the recipient.
  234.     to_phone = request.POST.get('To')
  235.     # The text body of the SMS message. Up to 160 characters long.
  236.     sms_body = request.POST.get('Body')
  237.  
  238.  
  239.     try:
  240.         user = UserProfile.objects.get(phone_number=from_phone)
  241.     except:
  242.         user = None
  243.  
  244.     regex = re.compile(r'(?P<command>(SMS|PLAY|CLUE|GOT|WIN))\s*(?P<argument>\w*)', re.IGNORECASE)
  245.     m = re.match(regex, sms_body)
  246.     if not m:
  247.         return HttpResponseForbidden("Unknown Command")
  248.     else:
  249.         if m.group('command').upper() == 'PLAY':
  250.             return play(m.group('argument'), from_phone, user, default_pw)
  251.         elif m.group('command').upper() == 'SMS':
  252.             return sms()
  253.         elif m.group('command').upper() == 'CLUE':
  254.             return clue(m.group('argument'), user)
  255.         elif m.group('command').upper() == 'GOT':
  256.             return get(m.group('argument'), user)
  257.         elif m.group('command').upper() == 'WIN':
  258.             return win(m.group('argument'), user)
  259.  
  260. def play(arg, phone_number, user, pw):
  261.     if user:
  262.         try:
  263.             gets = Gets.objects.filter(user=user.pk)
  264.             wards = map(lambda x: x.ward.ward_number, gets)
  265.             ward_str = "So far you GOT painted rocks from wards: "
  266.             for w in wards:
  267.                 ward_str += w +'; '
  268.             return SmsResponse(ward_str)
  269.         except:
  270.             return SmsResponse("So far you GOT painted rocks from none of the wards. Try CLUE [ward number] for clues. Visit prhg.net for more. This tel# is your password")
  271.     elif arg != '':
  272.         user = User.objects.create_user(arg, '', pw)
  273.         user.save()
  274.         user_profile = UserProfile.objects.get(user=user.pk)
  275.         user_profile.phone_number = phone_number
  276.         user_profile.save()
  277.         return SmsResponse("Hi! Send CLUE [num 1-8] for a ward's address hint; SMS for commands. Visit prhg.net for rules/clues commands/wins. This tel# (numbers only) is your password.")
  278.     else:
  279.         return SmsResponse("I'm gonna need a nick from you. Try: PLAY [nickname]")
  280.  
  281. def sms():
  282.     return SmsResponse("Text PLAY to join or for your status; CLUE [a digit 1-8] for hints; WIN [the solved secret word] to guess the final word.")
  283.  
  284. def clue(arg, user):
  285.     if user:
  286.         if arg == '1':
  287.             return SmsResponse("16th and CRESCENT PL NW In garden; by sign. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  288.         elif arg == '2':
  289.             return SmsResponse("14th and P STs NW, on your way to get tickets, inside and out. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  290.         elif arg == '3':
  291.             return SmsResponse("Btwn Conn Ave, Van Ness, and Yuma. UDC Amphitheatre. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  292.         elif arg == '4':
  293.             return SmsResponse("Taylor and Georgia plus red bikes. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  294.         elif arg == '5':
  295.             return SmsResponse("North side of Florida Ave NE btwn Orren and Staples: grass terrace. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  296.         elif arg == '6':
  297.             return SmsResponse("Near Virginia Ave park, grassy knoll; Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  298.         elif arg == '7':
  299.             return SmsResponse("Height/Benning Library: Lower Level Landscaping Features. Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  300.         elif arg == '8':
  301.             return SmsResponse("ARCH on MLK-Vivid; Send GOT [ward number] to report your get; SMS for commands; More at prhg.net")
  302.         else:
  303.             return SmsResponse("Unknown ward number")
  304.     else:
  305.         if arg == '1':
  306.             return SmsResponse("Along the Washington Meridian, on the Laughlin/Meyer side of the tracks. To register to play, send PLAY [a nickname] or go to prhg.net")
  307.         elif arg == '2':
  308.             return SmsResponse("Not Woolly, not Arena, not Source (but close). To register to play, send PLAY [a nickname] or go to prhg.net")
  309.         elif arg == '3':
  310.             return SmsResponse("UDC. To register to play, send PLAY [a nickname] or go to prhg.net")
  311.         elif arg == '4':
  312.             return SmsResponse("YES! + a Petworth cool off spot. To register to play, send PLAY [a nickname] or go to prhg.net")
  313.         elif arg == '5':
  314.             return SmsResponse("Circa busiest fire engine station in the USA - HOUSE OF PAIN. To register to play, send PLAY [a nickname] or go to prhg.net")
  315.         elif arg == '6':
  316.             return SmsResponse("Lower 8th Street Historic District, north of Potomac. To register to play, send PLAY [a nickname] or go to prhg.net")
  317.         elif arg == '7':
  318.             return SmsResponse("Between Mahan's fort and William Benning's Bridge. To register to play, send PLAY [a nickname] or go to prhg.net")
  319.         elif arg == '8':
  320.             return SmsResponse("ARCH on MLK. To register to play, send PLAY [a nickname] or go to prhg.net")
  321.         else:
  322.             return SmsResponse("Unknown ward number")
  323.  
  324. def get(arg, user):
  325.     if user:
  326.         if str(arg) in '12345678':
  327.             this_get = Gets(user=user, ward=Ward.objects.get(ward_number=int(arg)))
  328.             this_get.save()
  329.             return SmsResponse("Nicely played! You're on your way!")
  330.         else:
  331.             return SmsResponse("Unknown ward number. To register a rock you've claimed, send GOT [ward number].")
  332.     else:
  333.         return HttpResponseForbidden("No user to get with")
  334.  
  335. def win(arg, user):
  336.     if user:
  337.         if arg in 'T@CTICS!':
  338.             user.won = True
  339.             user.save()
  340.             return SmsResponse("You've won!")
  341.         else:
  342.             return SmsResponse("Sorry, try again!")
  343.     else:
  344.         return HttpResponseForbidden("No user to win with")
  345.  
  346.  
  347. # ward | char
  348. # 1 |   T
  349. # 2 |   @
  350. # 3 |   C
  351. # 4 |   T
  352. # 5 |   I
  353. # 6 |   C
  354. # 7 |   S
  355. # 8 |   !
  356.  
  357. from django import forms
  358. from main.models import UserProfile, Ward, Gets
  359. from django.forms.widgets import HiddenInput
  360.  
  361. class WardGetForm(forms.Form):
  362.     secret_char = forms.CharField(max_length=1)
  363.     ward_number = forms.HiddenInput
  364.  
  365. def wardget(request):
  366.     if request.method == 'POST':
  367.         form = WardGetForm(request.POST)
  368.         if form.is_valid():
  369.             secret_char = form.cleaned_data['secret_char']
  370.             ward = request.POST.get('ward_number')
  371.             secret_word = 'T@CTICS!'
  372.             user = request.user
  373.             if secret_char.upper() == secret_word[int(ward)-1]:
  374.                 get_this_ward = Gets(user=user.get_profile(), ward=Ward.objects.get(ward_number=int(ward)))
  375.                 get_this_ward.save()
  376.                 return HttpResponseRedirect('/')
  377.             else:
  378.                 form = WardGetForm() # An unbound form
  379.                 return HttpResponseRedirect('/')
  380.  
  381. from main.models import UserProfile
  382.  
  383. class WinningForm(forms.Form):
  384.     the_secret_word_is = forms.CharField(max_length=8)
  385.    
  386. def winning(request):
  387.     if request.method == 'POST':
  388.         winning_word = 'T@CTICS!'
  389.         winform = WinningForm(request.POST)
  390.         if winform.is_valid():
  391.             guessed_secret_word = winform.cleaned_data['the_secret_word_is']
  392.             user = request.user
  393.             if guessed_secret_word.upper() == winning_word:
  394.                 winner, created = UserProfile.objects.get_or_create(user=request.user.id)
  395.                 # print "request.user.id: " + str(request.user.id)
  396.                 # print "winner.won preset: " + str(winner.won)
  397.                 if created:
  398.                     winner.won = True
  399.                 elif winner.won != True:
  400.                     winner.won = True
  401.                 winner.save()
  402.                 # print "winner.won postset: " + str(winner.won)
  403.                 return HttpResponseRedirect('/')
  404.             else:
  405.                 winform = WinningForm()
  406.                 return HttpResponseRedirect('/')
  407.  
  408.  # ------------------------------------------------
  409. from django import forms
  410. from main.models import UserProfile, PostalAddress
  411. from django.contrib.auth.models import User, SiteProfileNotAvailable
  412.  
  413. class AddressForm(forms.Form):
  414.     first_name = forms.CharField(max_length=30)
  415.     last_name = forms.CharField(max_length=30)
  416.     email = EmailField(label="Email")
  417.  
  418.     class Meta:
  419.         model = User
  420.         fields = ('first_name', 'last_name', 'email')
  421.    
  422.     address_1 = forms.CharField(max_length=200)
  423.     address_2 = forms.CharField(max_length=200)
  424.     city = forms.CharField(max_length=100)
  425.     state = forms.CharField(max_length=2)
  426.     zip_code = forms.CharField(max_length=9)
  427.  
  428.     def save(self, user, *args, **kwargs):
  429.         address = PostalAddress(player=user.get_profile())
  430.         user.first_name = self.cleaned_data["first_name"]
  431.         user.last_name = self.cleaned_data["last_name"]
  432.         user.email = self.cleaned_data["email"]
  433.         address.line_1 = self.cleaned_data['address_1']
  434.         address.line_2 = self.cleaned_data['address_2']
  435.         address.city = self.cleaned_data['city']
  436.         address.state_province = self.cleaned_data['state']
  437.         z = self.cleaned_data['zip_code']
  438.         address.postal_code = filter(lambda x: x.isdigit(), z)
  439.         address.save()
  440.         user.save()
  441.         return address
  442.  
  443. def sendtoaddr(request):
  444.     userprofile = UserProfile.objects.get(user=request.user)
  445.     if request.method == 'POST':
  446.         optout_of_award = request.POST.get('cancel', None)
  447.         if optout_of_award:
  448.             city = "award_optout"
  449.             optout, wascreated = PostalAddress.objects.get_or_create(player_id=request.user.id, defaults= {"line_1": '', "line_2": '', "city": city, "state_province": '', "postal_code": ''})
  450.             return HttpResponseRedirect('/')
  451.         else:
  452.             addrform = AddressForm(request.POST)
  453.             if addrform.is_valid():
  454.                 addrform.save(user=request.user)
  455.                 return HttpResponseRedirect('/')
  456.     else:
  457.         addrform = AddressForm()
  458.         return HttpResponseRedirect('/')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement