views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #! /usr/bin/env python
  2. # emacs-mode: -*- python-*-
  3. # -*- coding: utf-8 -*-
  4. from datetime import datetime
  5. from django.db.models import Q
  6. import django.utils.simplejson as json
  7. import operator
  8. from django.shortcuts import render_to_response
  9. from django.shortcuts import get_object_or_404
  10. from django.http import HttpResponseRedirect, Http404, HttpResponse
  11. from django.template import RequestContext
  12. from django.contrib.auth.decorators import permission_required
  13. from django.core import serializers
  14. from adzone.models import AdBase, AdClick, BannerAd, TextAd, AdImpression
  15. def ad_view(request, id):
  16. """
  17. Record the click in the database, then redirect to ad url
  18. """
  19. ad = get_object_or_404(AdBase, id=id)
  20. try:
  21. if not request.excluded_ip:
  22. click = AdClick(ad=ad, click_date=datetime.now(), source_ip=request.META.get('REMOTE_ADDR'))
  23. click.save()
  24. except:
  25. raise Http404
  26. return HttpResponseRedirect(ad.url)
  27. def ad_display(request):
  28. """
  29. Simply pull an ad from the db and display it as a raw img.
  30. This was added to interface with legacy apps in iframes.
  31. Currently it's hardwired to calendar zone, but could be made scriptabled via GET params.
  32. """
  33. context = RequestContext(request)
  34. ad = AdBase.objects.get_random_ad('', 'towers')
  35. from_ip = request.META['REMOTE_ADDR']
  36. if not request.excluded_ip:
  37. impression = AdImpression(ad=ad, impression_date=datetime.now(), source_ip=from_ip)
  38. impression.save()
  39. return render_to_response('adzone/ad_display.html', locals(), context_instance=RequestContext(request))
  40. def _convert_string(date):
  41. if date == "Today":
  42. return datetime.now().strftime('%Y-%m-%d')
  43. elif date == "Yesterday":
  44. return (datetime.now()-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
  45. else:
  46. return date
  47. @permission_required('adzone.change_adbase')
  48. def ad_index(request):
  49. ad_list=[]
  50. if request.method == 'GET':
  51. filter=[]
  52. if 'start' in request.GET:
  53. start = _convert_string(request.GET.get('start'))
  54. filter.append(start)
  55. if 'end' in request.GET:
  56. end = _convert_string(request.GET.get('end'))
  57. filter.append(end)
  58. ads = AdBase.objects.enabled()
  59. for ad in ads:
  60. ad_list.append([ad, ad.impressions(*filter), ad.clicks(*filter)])
  61. else:
  62. ads = AdBase.objects.enabled()
  63. for ad in ads:
  64. ad_list.append([ad, ad.impressions(), ad.clicks()])
  65. return render_to_response('adzone/ad_index.html', locals(), context_instance=RequestContext(request))
  66. @permission_required('adzone.change_adbase')
  67. def ad_detail(request, id, type):
  68. if request.method == 'GET':
  69. filter=[]
  70. if 'start' in request.GET:
  71. start = _convert_string(request.GET.get('start'))
  72. filter.append(start)
  73. if 'end' in request.GET:
  74. end = _convert_string(request.GET.get('end'))
  75. filter.append(end)
  76. if type == "banner":
  77. ad=BannerAd.objects.get(pk=id)
  78. else:
  79. ad=AdBase.objects.get(pk=id)
  80. return render_to_response('adzone/ad_detail.html', locals(), context_instance=RequestContext(request))
  81. @permission_required('adzone.change_adbase')
  82. def xhr_ad_detail(request, format=None):
  83. ad_list = []
  84. kwargs = {}
  85. if request.is_ajax():
  86. if request.method == 'POST':
  87. if 'start' in request.POST:
  88. try:
  89. start = request.POST.get('start')
  90. start_date = datetime.strptime(start, '%Y-%m-%d')
  91. kwargs.update({'start': start_date})
  92. except ValueError:
  93. pass
  94. if 'end' in request.POST:
  95. try:
  96. end = request.POST.get('end')
  97. end_date = datetime.strptime(end, '%Y-%m-%d')
  98. kwargs.update({'end': end_date})
  99. except ValueError:
  100. pass
  101. ads = AdBase.objects.enabled()
  102. for ad in ads:
  103. ad_list.append([ad.title, ad.impressions(**kwargs),
  104. ad.clicks(**kwargs)])
  105. if format == 'json':
  106. mimetype='application/json'
  107. data = json.dumps(ad_list)
  108. else:
  109. return HttpResponse(status=400)
  110. return HttpResponse(data, mimetype)
  111. @permission_required('adzone.change_adbase')
  112. def xhr_ad_table(request, format=None):
  113. if request.is_ajax():
  114. ad_list=[]
  115. if request.method == 'POST':
  116. ads = AdBase.objects.enabled()
  117. if format == 'json':
  118. mimetype='application/json'
  119. if format == 'xml':
  120. mimetype='application/xml'
  121. if format == 'html':
  122. mimetype='text/html'
  123. data = serializers.serialize(format, ads)
  124. return HttpResponse(data, mimetype)