views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. """ Admin views """
  2. from django.core.urlresolvers import reverse
  3. from django.http import HttpResponseRedirect
  4. from django.shortcuts import render_to_response, get_object_or_404
  5. from django.template import RequestContext
  6. from django.contrib.admin.views.decorators import staff_member_required
  7. from django.contrib.auth.decorators import permission_required
  8. from accounts.utils import get_subscriptions
  9. from catalog.models import Item, Book, Map, Movie, Person, Subscription, ZipCode
  10. from store_order.models import Order, OrderItem
  11. from catalog.forms import (
  12. MovieForm,
  13. MapForm,
  14. PersonForm,
  15. BookForm,
  16. SubscriptionForm,
  17. PostalCodeForm,
  18. )
  19. @staff_member_required
  20. @permission_required("pbp_core.store_admin_login")
  21. def store_admin_home(request):
  22. """ Store Admin Home page """
  23. # TODO: security, etc
  24. return render_to_response(
  25. "pbp_store/store_admin/home.html", context_instance=RequestContext(request)
  26. )
  27. @staff_member_required
  28. @permission_required("pbp_core.store_catalog_edit")
  29. def add_edit_subscription(
  30. request, sku=None, template="pbp_store/store_admin/add_edit.html"
  31. ):
  32. """ Add catalogs form """
  33. return add_edit(
  34. request,
  35. Subscription,
  36. SubscriptionForm,
  37. "Subscription",
  38. sku=sku,
  39. template=template,
  40. )
  41. @staff_member_required
  42. @permission_required("pbp_core.store_catalog_edit")
  43. def add_edit_book(request, sku=None, template="pbp_store/store_admin/add_edit.html"):
  44. """ Add / edit book """
  45. return add_edit(request, Book, BookForm, "Book", sku=sku, template=template)
  46. @staff_member_required
  47. @permission_required("pbp_core.store_catalog_edit")
  48. def add_edit_map(request, sku=None, template="pbp_store/store_admin/add_edit.html"):
  49. """ Add / edit map """
  50. return add_edit(request, Map, MapForm, "Map", sku=sku, template=template)
  51. @staff_member_required
  52. @permission_required("pbp_core.store_catalog_edit")
  53. def add_edit_movie(request, sku=None, template="pbp_store/store_admin/add_edit.html"):
  54. """ Add / edit movie """
  55. return add_edit(request, Movie, MovieForm, "Movie", sku=sku, template=template)
  56. def add_edit(request, model, modelform, title, sku=None, template=None):
  57. """ Add edit item """
  58. item = None
  59. edit_mode = False
  60. if sku:
  61. item = get_object_or_404(model, sku=sku)
  62. edit_mode = True
  63. form = modelform(request.POST or None, request.FILES or None, instance=item)
  64. if form.is_valid():
  65. item = form.save(commit=False)
  66. if not edit_mode:
  67. item.created_by = request.user
  68. item.last_updated_by = request.user
  69. item.save()
  70. if item.is_book:
  71. form.save_m2m()
  72. return HttpResponseRedirect(reverse("catalog_list"))
  73. cancel_url = reverse("catalog_list")
  74. return render_to_response(
  75. template,
  76. {
  77. "form": form,
  78. "edit_mode": edit_mode,
  79. "item_type": title,
  80. "cancel_url": cancel_url,
  81. },
  82. context_instance=RequestContext(request),
  83. )
  84. @staff_member_required
  85. @permission_required("pbp_core.store_catalog_edit")
  86. def delete_item(request, sku, template="pbp_store/store_admin/delete_confirm.html"):
  87. """ Add movie """
  88. item = get_object_or_404(Item, sku=sku)
  89. if request.method == "POST":
  90. item.deleted = True
  91. item.last_updated_by = request.user
  92. item.save()
  93. return HttpResponseRedirect(reverse("catalog_list"))
  94. return render_to_response(
  95. template, {"item": item}, context_instance=RequestContext(request)
  96. )
  97. @staff_member_required
  98. @permission_required("pbp_core.store_catalog_view")
  99. def list_catalog(
  100. request, category="all", template="pbp_store/store_admin/catalog_list.html"
  101. ):
  102. """ Simple list of all the catalogs """
  103. config = {
  104. "movie": Movie,
  105. "book": Book,
  106. "map": Map,
  107. "subscription": Subscription,
  108. "all": Item,
  109. }
  110. model = config.get(category, Item)
  111. # sort by title or price, asc or desc default to title asc
  112. catalog = model.objects.active()
  113. return render_to_response(
  114. template,
  115. {"catalog": catalog, "category": category},
  116. context_instance=RequestContext(request),
  117. )
  118. @staff_member_required
  119. @permission_required("pbp_core.store_admin_orders")
  120. def list_orders(request, template="pbp_store/store_admin/order_list.html"):
  121. """ Simple list of all the orders """
  122. config = {
  123. "init": Order.INIT,
  124. "submitted": Order.SUBMITTED,
  125. "processed": Order.PROCESSED,
  126. "shipped": Order.SHIPPED,
  127. "cancelled": Order.CANCELLED,
  128. }
  129. status = request.GET.get("status", "processed")
  130. if status == "all":
  131. orders = Order.objects.all()
  132. else:
  133. status_filter = config.get(status)
  134. orders = Order.objects.filter(status=status_filter)
  135. return render_to_response(
  136. template,
  137. {"orders": orders, "status": status},
  138. context_instance=RequestContext(request),
  139. )
  140. @staff_member_required
  141. @permission_required("pbp_core.store_admin_orders")
  142. def view_order_detail(
  143. request, order_number, template="pbp_store/store_admin/order.html"
  144. ):
  145. """ View order details """
  146. order = get_object_or_404(Order, pk=order_number)
  147. return render_to_response(
  148. template, {"order": order}, context_instance=RequestContext(request)
  149. )
  150. @staff_member_required
  151. @permission_required("pbp_core.store_admin_orders")
  152. def list_subscriptions(
  153. request, template="pbp_store/store_admin/subscription_list.html"
  154. ):
  155. """ Simple list of all the orders """
  156. config = {
  157. "init": Order.INIT,
  158. "submitted": Order.SUBMITTED,
  159. "processed": Order.PROCESSED,
  160. "shipped": Order.SHIPPED,
  161. "cancelled": Order.CANCELLED,
  162. }
  163. status = request.GET.get("status", "processed")
  164. if status == "all":
  165. order_items = OrderItem.objects.filter(
  166. product__subclass_type__iexact=Subscription.__name__.lower()
  167. )
  168. else:
  169. status_filter = config.get(status)
  170. order_items = OrderItem.objects.filter(
  171. product__subclass_type__iexact=Subscription.__name__.lower()
  172. ).filter(order__status=status_filter)
  173. return render_to_response(
  174. template,
  175. {"order_items": order_items, "status": status},
  176. context_instance=RequestContext(request),
  177. )
  178. @staff_member_required
  179. @permission_required("pbp_core.store_admin_orders")
  180. def subscription_detail(
  181. request,
  182. order_number,
  183. order_item=None,
  184. template="pbp_store/store_admin/subscription_detail.html",
  185. ):
  186. """ Simple list of all the orders """
  187. order = get_object_or_404(Order, pk=order_number)
  188. if order_number:
  189. order_items = get_subscriptions(order=order)
  190. return render_to_response(
  191. template,
  192. {"order_items": order_items, "order": order},
  193. context_instance=RequestContext(request),
  194. )
  195. @staff_member_required
  196. @permission_required("pbp_core.store_catalog_view")
  197. def list_postal_codes(request, template="pbp_store/store_admin/postal_code_list.html"):
  198. """ list the postal codes """
  199. postal_codes = ZipCode.objects.active()
  200. return render_to_response(
  201. template,
  202. {"postal_codes": postal_codes},
  203. context_instance=RequestContext(request),
  204. )
  205. @staff_member_required
  206. @permission_required("pbp_core.store_catalog_edit")
  207. def add_edit_postal_code(
  208. request, postal_code=None, template="pbp_store/store_admin/add_edit.html"
  209. ):
  210. """ Add edit postal_code """
  211. item = None
  212. edit_mode = False
  213. if postal_code:
  214. item = get_object_or_404(ZipCode, zipcode=postal_code)
  215. edit_mode = True
  216. form = PostalCodeForm(request.POST or None, instance=item)
  217. if form.is_valid():
  218. item = form.save(commit=False)
  219. if not edit_mode:
  220. item.created_by = request.user
  221. item.last_updated_by = request.user
  222. item.save()
  223. return HttpResponseRedirect(reverse("postal_code_list"))
  224. cancel_url = reverse("postal_code_list")
  225. return render_to_response(
  226. template,
  227. {
  228. "form": form,
  229. "edit_mode": edit_mode,
  230. "item_type": "Postal Code",
  231. "cancel_url": cancel_url,
  232. },
  233. context_instance=RequestContext(request),
  234. )
  235. @staff_member_required
  236. @permission_required("pbp_core.store_catalog_edit")
  237. def delete_postal_code(
  238. request, postal_code, template="pbp_store/store_admin/delete_confirm.html"
  239. ):
  240. """ Add movie """
  241. item = get_object_or_404(ZipCode, zipcode=postal_code)
  242. if request.method == "POST":
  243. item.deleted = True
  244. item.last_updated_by = request.user
  245. item.save()
  246. return HttpResponseRedirect(reverse("postal_code_list"))
  247. return render_to_response(
  248. template, {"item": item}, context_instance=RequestContext(request)
  249. )
  250. @staff_member_required
  251. @permission_required("pbp_core.store_catalog_view")
  252. def list_persons(request, template="pbp_store/store_admin/person_list.html"):
  253. """ list the postal codes """
  254. persons = Person.objects.active()
  255. return render_to_response(
  256. template, {"persons": persons}, context_instance=RequestContext(request)
  257. )
  258. @staff_member_required
  259. @permission_required("pbp_core.store_catalog_edit")
  260. def add_edit_person(
  261. request, person_slug=None, template="pbp_store/store_admin/add_edit.html"
  262. ):
  263. """ Add edit Author """
  264. item = None
  265. edit_mode = False
  266. if person_slug:
  267. item = get_object_or_404(Person, slug=person_slug)
  268. edit_mode = True
  269. form = PersonForm(request.POST or None, request.FILES or None, instance=item)
  270. if form.is_valid():
  271. item = form.save(commit=False)
  272. if not edit_mode:
  273. item.created_by = request.user
  274. item.last_updated_by = request.user
  275. item.save()
  276. return HttpResponseRedirect(reverse("person_list"))
  277. cancel_url = reverse("person_list")
  278. return render_to_response(
  279. template,
  280. {
  281. "form": form,
  282. "edit_mode": edit_mode,
  283. "item_type": "Person",
  284. "cancel_url": cancel_url,
  285. },
  286. context_instance=RequestContext(request),
  287. )
  288. @staff_member_required
  289. @permission_required("pbp_core.store_catalog_edit")
  290. def delete_person(
  291. request, person_slug, template="pbp_store/store_admin/delete_confirm.html"
  292. ):
  293. """ Add movie """
  294. item = get_object_or_404(Person, slug=person_slug)
  295. if request.method == "POST":
  296. item.deleted = True
  297. item.last_updated_by = request.user
  298. item.save()
  299. return HttpResponseRedirect(reverse("person_list"))
  300. return render_to_response(
  301. template, {"item": item}, context_instance=RequestContext(request)
  302. )