views.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from django.shortcuts import render, get_object_or_404
  2. from django.http import HttpResponseRedirect
  3. from django.urls import reverse
  4. from django.views import generic
  5. from django.contrib.auth.decorators import login_required, permission_required
  6. from django.forms import modelformset_factory, inlineformset_factory
  7. from website.settings import APPLICATION_NAME
  8. from .models import Network, Host
  9. from .forms import NetworkForm, HostForm
  10. def default_keywords(additional_keywords=None):
  11. default_keywords = 'RotBot, robot, bot, irc, irc bot, irc robot, '
  12. if additional_keywords:
  13. additional_keywords = ', '.join(map(str, additional_keywords))
  14. return (default_keywords + additional_keywords)
  15. return (default_keywords)
  16. class IndexView(generic.ListView):
  17. template_name = 'rotbot/networks.html'
  18. context_object_name = 'network_list'
  19. extra_context = {
  20. 'title': 'RotBot',
  21. 'icon': 'robot',
  22. 'description': 'Index of RotBot, the IRC robot.',
  23. 'keywords': default_keywords() + 'index',
  24. }
  25. def get_queryset(self):
  26. #return Question.objects.order_by('-pub_date')[:5]
  27. return Network.objects
  28. def network(request, network_slug):
  29. network = get_object_or_404(Network, slug=network_slug)
  30. context = {
  31. 'parent_title': 'Networks',
  32. 'parent_url': 'rotbot:networks',
  33. 'parent_icon': 'robot',
  34. 'title': network.name,
  35. 'icon': 'sitemap',
  36. 'description': 'Details of ' + network.name,
  37. 'keywords': default_keywords() + 'network.name, display, details',
  38. 'network': network,
  39. }
  40. return render(request, 'rotbot/network.html', context)
  41. @login_required
  42. @permission_required('rotbot.change_network', raise_exception=True)
  43. def edit_network(request, network_slug):
  44. network = get_object_or_404(Network, slug=network_slug)
  45. title = network.name
  46. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  47. if request.method == 'POST':
  48. form = NetworkForm(request.POST, instance=network)
  49. formset = HostFormSet(request.POST, instance=network)
  50. if form.is_valid() and formset.is_valid():
  51. form.save()
  52. formset.save()
  53. return HttpResponseRedirect(reverse('rotbot:network', args=(network.slug,)))
  54. else:
  55. form = NetworkForm(instance=network)
  56. formset = HostFormSet(instance=network)
  57. context = {
  58. 'parent_title': 'Networks',
  59. 'parent_url': 'rotbot:networks',
  60. 'parent_icon': 'robot',
  61. 'title': title,
  62. 'icon': 'sitemap',
  63. 'description': 'Edit ' + title,
  64. 'keywords': default_keywords((title, 'edit')),
  65. 'network_slug': network_slug,
  66. 'form': form,
  67. 'hostformset': formset,
  68. }
  69. return render(request, 'rotbot/edit_network.html', context)
  70. @login_required
  71. @permission_required('rotbot.add_network', raise_exception=True)
  72. def add_network(request):
  73. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  74. if request.method == 'POST':
  75. form = NetworkForm(request.POST)
  76. if form.is_valid():
  77. network = form.save()
  78. formset = HostFormSet(request.POST, instance=network)
  79. if formset.is_valid():
  80. formset.save()
  81. return HttpResponseRedirect(reverse('rotbot:network', args=(form.cleaned_data['slug'],)))
  82. else: # Not a POST request.
  83. form = NetworkForm()
  84. formset = HostFormSet(queryset=Host.objects.none())
  85. context = {
  86. 'parent_title': 'Networks',
  87. 'parent_url': 'rotbot:networks',
  88. 'parent_icon': 'robot',
  89. 'title': 'Add network',
  90. 'icon': 'sitemap',
  91. 'description': 'Add new irc network to ' + APPLICATION_NAME,
  92. 'keywords': default_keywords() + 'add, add network',
  93. 'form': form,
  94. 'hostformset': formset,
  95. }
  96. return render(request, 'rotbot/add_network.html', context)
  97. @login_required
  98. @permission_required('rotbot.change_network', raise_exception=True)
  99. def delete_network(request, network_slug):
  100. network = get_object_or_404(Network, slug=network_slug)
  101. network.delete()
  102. return HttpResponseRedirect(reverse('rotbot:networks'))