views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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, Channel, User, Message
  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. def networks(request):
  17. networks = Network.objects.all()
  18. channels = Channel.objects.all()
  19. users = User.objects.all()
  20. messages = Message.objects.all()
  21. context = {
  22. 'title': 'RotBot',
  23. 'icon': 'robot',
  24. 'description': 'Index of RotBot, the IRC robot.',
  25. 'keywords': default_keywords('index'),
  26. 'networks': networks,
  27. 'network_amount': networks.count(),
  28. 'channel_amount': channels.count(),
  29. 'user_amount': users.count(),
  30. 'message_amount': messages.count(),
  31. }
  32. return render(request, 'rotbot/networks.html', context)
  33. def network(request, network_slug):
  34. network = get_object_or_404(Network, slug=network_slug)
  35. channels = Channel.objects.filter(network=network)
  36. users = User.objects.filter(network=network)
  37. messages = Message.objects.filter(network=network)
  38. context = {
  39. 'parent_title': 'Networks',
  40. 'parent_url': 'rotbot:networks',
  41. 'parent_icon': 'robot',
  42. 'title': network.name,
  43. 'icon': 'sitemap',
  44. 'description': 'Details of ' + network.name,
  45. 'keywords': default_keywords() + 'network.name, display, details',
  46. 'network': network,
  47. 'channel_amount': channels.count(),
  48. 'user_amount': users.count(),
  49. 'message_amount': messages.count(),
  50. }
  51. return render(request, 'rotbot/network.html', context)
  52. @login_required
  53. @permission_required('rotbot.change_network', raise_exception=True)
  54. def edit_network(request, network_slug):
  55. network = get_object_or_404(Network, slug=network_slug)
  56. title = network.name
  57. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  58. if request.method == 'POST':
  59. form = NetworkForm(request.POST, instance=network)
  60. formset = HostFormSet(request.POST, instance=network)
  61. if form.is_valid() and formset.is_valid():
  62. form.save()
  63. formset.save()
  64. return HttpResponseRedirect(reverse('rotbot:network', args=(network.slug,)))
  65. else:
  66. form = NetworkForm(instance=network)
  67. formset = HostFormSet(instance=network)
  68. context = {
  69. 'parent_title': 'Networks',
  70. 'parent_url': 'rotbot:networks',
  71. 'parent_icon': 'robot',
  72. 'title': title,
  73. 'icon': 'sitemap',
  74. 'description': 'Edit ' + title,
  75. 'keywords': default_keywords((title, 'edit')),
  76. 'network_slug': network_slug,
  77. 'form': form,
  78. 'hostformset': formset,
  79. }
  80. return render(request, 'rotbot/edit_network.html', context)
  81. @login_required
  82. @permission_required('rotbot.add_network', raise_exception=True)
  83. def add_network(request):
  84. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  85. if request.method == 'POST':
  86. form = NetworkForm(request.POST)
  87. if form.is_valid():
  88. network = form.save()
  89. formset = HostFormSet(request.POST, instance=network)
  90. if formset.is_valid():
  91. formset.save()
  92. return HttpResponseRedirect(reverse('rotbot:network', args=(form.cleaned_data['slug'],)))
  93. else:
  94. formset = HostFormSet(queryset=Host.objects.none())
  95. else: # Not a POST request.
  96. form = NetworkForm()
  97. formset = HostFormSet(queryset=Host.objects.none())
  98. context = {
  99. 'parent_title': 'Networks',
  100. 'parent_url': 'rotbot:networks',
  101. 'parent_icon': 'robot',
  102. 'title': 'Add network',
  103. 'icon': 'sitemap',
  104. 'description': 'Add new irc network to ' + APPLICATION_NAME,
  105. 'keywords': default_keywords() + 'add, add network',
  106. 'form': form,
  107. 'hostformset': formset,
  108. }
  109. return render(request, 'rotbot/add_network.html', context)
  110. @login_required
  111. @permission_required('rotbot.change_network', raise_exception=True)
  112. def delete_network(request, network_slug):
  113. network = get_object_or_404(Network, slug=network_slug)
  114. network.delete()
  115. return HttpResponseRedirect(reverse('rotbot:networks'))