network.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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.forms import inlineformset_factory
  5. from django.contrib.auth.decorators import login_required, permission_required
  6. from website.settings import APPLICATION_NAME
  7. from rotbot.models import Network, Host, Channel, User, Message, Action, Notice, Join, Kick, Owner
  8. from rotbot.forms import NetworkForm, HostForm, OwnerForm
  9. from .common import default_keywords, shorten_number, total_messages
  10. def networks(request):
  11. networks = Network.objects.all()
  12. hosts = Host.objects.all()
  13. channels = Channel.objects.all()
  14. users = User.objects.all()
  15. messages = Message.objects.all()
  16. actions = Action.objects.all()
  17. notices = Notice.objects.all()
  18. joins = Join.objects.all()
  19. kicks = Kick.objects.all()
  20. total_level, total_xp_spent, total_ap_spent, total_coin, total_coin_spent, total_coin_given = user_totals(users)
  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. 'total_networks': shorten_number(networks.count()),
  28. 'total_hosts': shorten_number(hosts.count()),
  29. 'total_chanels': shorten_number(channels.count()),
  30. 'total_users': shorten_number(users.count()),
  31. 'total_messages': shorten_number(total_messages(messages)),
  32. 'total_actions': shorten_number(total_messages(actions)),
  33. 'total_notices': shorten_number(total_messages(notices)),
  34. 'total_joins': shorten_number(joins.count()),
  35. 'total_kicks': shorten_number(kicks.count()),
  36. 'total_level': total_level,
  37. 'total_xp_spent': total_xp_spent,
  38. 'total_ap_spent': total_ap_spent,
  39. 'total_coin': total_coin,
  40. 'total_coin_spent': total_coin_spent,
  41. 'total_coin_given': total_coin_given,
  42. }
  43. return render(request, 'rotbot/networks.html', context)
  44. def user_totals(users):
  45. total_level = 0
  46. total_xp_spent = 0
  47. total_ap_spent = 0
  48. total_coin = 0
  49. total_coin_spent = 0
  50. total_coin_given = 0
  51. for user in users:
  52. total_level += user.level
  53. total_xp_spent += user.xp_spent
  54. total_ap_spent += user.ap_spent
  55. total_coin += user.coin
  56. total_coin_spent += user.coin_spent
  57. total_coin_given += user.coin_given
  58. return total_level, total_xp_spent, total_ap_spent, total_coin, total_coin_spent, total_coin_given
  59. def network(request, network_slug):
  60. network = get_object_or_404(Network, slug=network_slug)
  61. hosts = Host.objects.filter(network=network)
  62. channels = Channel.objects.filter(network=network)
  63. users = User.objects.filter(network=network)
  64. messages = Message.objects.filter(network=network)
  65. actions = Action.objects.filter(network=network)
  66. notices = Notice.objects.filter(network=network)
  67. joins = Join.objects.all()
  68. kicks = Kick.objects.all()
  69. for host in hosts:
  70. host.connection_fails = host.connection_attempts - host.connection_succeeds
  71. total_level, total_xp_spent, total_ap_spent, total_coin, total_coin_spent, total_coin_given = user_totals(users)
  72. context = {
  73. 'parent_title': 'Networks',
  74. 'parent_url': reverse('rotbot:networks'),
  75. 'parent_icon': 'robot',
  76. 'title': network.name,
  77. 'icon': 'sitemap',
  78. 'description': 'Details of ' + network.name,
  79. 'keywords': default_keywords() + 'network.name, display, details',
  80. 'network': network,
  81. 'hosts': hosts,
  82. 'channels': channels,
  83. 'total_hosts': shorten_number(hosts.count()),
  84. 'total_chanels': shorten_number(channels.count()),
  85. 'total_users': shorten_number(users.count()),
  86. 'total_messages': shorten_number(total_messages(messages)),
  87. 'total_actions': shorten_number(total_messages(actions)),
  88. 'total_notices': shorten_number(total_messages(notices)),
  89. 'total_joins': shorten_number(joins.count()),
  90. 'total_kicks': shorten_number(kicks.count()),
  91. 'total_level': total_level,
  92. 'total_xp_spent': total_xp_spent,
  93. 'total_ap_spent': total_ap_spent,
  94. 'total_coin': total_coin,
  95. 'total_coin_spent': total_coin_spent,
  96. 'total_coin_given': total_coin_given,
  97. }
  98. return render(request, 'rotbot/network.html', context)
  99. @login_required
  100. @permission_required('rotbot.change_network', raise_exception=True)
  101. def edit_network(request, network_slug):
  102. network = get_object_or_404(Network, slug=network_slug)
  103. title = network.name
  104. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  105. OwnerFormSet = inlineformset_factory(Network, Owner, form=OwnerForm)
  106. if request.method == 'POST':
  107. form = NetworkForm(request.POST, instance=network)
  108. hostformset = HostFormSet(request.POST, instance=network)
  109. ownerformset = HostFormSet(request.POST, instance=network)
  110. if form.is_valid() and hostformset.is_valid() and ownerformset.is_valid():
  111. form.save()
  112. hostformset.save()
  113. ownerformset.save()
  114. return HttpResponseRedirect(reverse('rotbot:network', args=(network.slug,)))
  115. else:
  116. form = NetworkForm(instance=network)
  117. hostformset = HostFormSet(instance=network)
  118. ownerformset = OwnerFormSet(instance=network)
  119. context = {
  120. 'parent_title': 'Networks',
  121. 'parent_url': reverse('rotbot:networks'),
  122. 'parent_icon': 'robot',
  123. 'title': title,
  124. 'icon': 'sitemap',
  125. 'description': 'Edit ' + title,
  126. 'keywords': default_keywords((title, 'edit')),
  127. 'network_slug': network_slug,
  128. 'form': form,
  129. 'hostformset': hostformset,
  130. 'ownerformset': ownerformset,
  131. }
  132. return render(request, 'rotbot/edit_network.html', context)
  133. @login_required
  134. @permission_required('rotbot.add_network', raise_exception=True)
  135. def add_network(request):
  136. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  137. if request.method == 'POST':
  138. form = NetworkForm(request.POST)
  139. if form.is_valid():
  140. network = form.save()
  141. formset = HostFormSet(request.POST, instance=network)
  142. if formset.is_valid():
  143. formset.save()
  144. return HttpResponseRedirect(reverse('rotbot:network', args=(form.cleaned_data['slug'],)))
  145. else:
  146. formset = HostFormSet(queryset=Host.objects.none())
  147. else: # Not a POST request.
  148. form = NetworkForm()
  149. formset = HostFormSet(queryset=Host.objects.none())
  150. context = {
  151. 'parent_title': 'Networks',
  152. 'parent_url': reverse('rotbot:networks'),
  153. 'parent_icon': 'robot',
  154. 'title': 'Add network',
  155. 'icon': 'sitemap',
  156. 'description': 'Add new irc network to ' + APPLICATION_NAME,
  157. 'keywords': default_keywords() + 'add, add network',
  158. 'form': form,
  159. 'hostformset': formset,
  160. }
  161. return render(request, 'rotbot/add_network.html', context)
  162. @login_required
  163. @permission_required('rotbot.change_network', raise_exception=True)
  164. def delete_network(request, network_slug):
  165. network = get_object_or_404(Network, slug=network_slug)
  166. network.delete()
  167. return HttpResponseRedirect(reverse('rotbot:networks'))