views.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. import datetime
  2. from django.shortcuts import render, get_object_or_404
  3. from django.http import HttpResponseRedirect
  4. from django.urls import reverse
  5. #from django.views import generic
  6. from django.contrib.auth.decorators import login_required, permission_required
  7. from django.forms import modelformset_factory, inlineformset_factory
  8. from website.settings import APPLICATION_NAME
  9. from .models import Network, Host, Channel, User, Message, Action, Notice, TempChannelKey, Join, Kick
  10. from .forms import NetworkForm, HostForm, ChannelForm
  11. def default_keywords(additional_keywords=None):
  12. default_keywords = 'RotBot, robot, bot, irc, irc bot, irc robot, '
  13. if additional_keywords:
  14. additional_keywords = ', '.join(map(str, additional_keywords))
  15. return (default_keywords + additional_keywords)
  16. return (default_keywords)
  17. def networks(request):
  18. networks = Network.objects.all()
  19. hosts = Host.objects.all()
  20. channels = Channel.objects.all()
  21. users = User.objects.all()
  22. messages = Message.objects.all()
  23. actions = Action.objects.all()
  24. notices = Notice.objects.all()
  25. joins = Join.objects.all()
  26. kicks = Kick.objects.all()
  27. context = {
  28. 'title': 'RotBot',
  29. 'icon': 'robot',
  30. 'description': 'Index of RotBot, the IRC robot.',
  31. 'keywords': default_keywords('index'),
  32. 'networks': networks,
  33. 'total_networks': shorten_number(networks.count()),
  34. 'total_hosts': shorten_number(hosts.count()),
  35. 'total_chanels': shorten_number(channels.count()),
  36. 'total_users': shorten_number(users.count()),
  37. 'total_messages': shorten_number(total_messages(messages)),
  38. 'total_actions': shorten_number(total_messages(actions)),
  39. 'total_notices': shorten_number(total_messages(notices)),
  40. 'total_joins': shorten_number(joins.count()),
  41. 'total_kicks': shorten_number(kicks.count()),
  42. }
  43. return render(request, 'rotbot/networks.html', context)
  44. def network(request, network_slug):
  45. network = get_object_or_404(Network, slug=network_slug)
  46. hosts = Host.objects.filter(network=network)
  47. channels = Channel.objects.filter(network=network)
  48. users = User.objects.filter(network=network)
  49. messages = Message.objects.filter(network=network)
  50. actions = Action.objects.filter(network=network)
  51. notices = Notice.objects.filter(network=network)
  52. joins = Join.objects.all()
  53. kicks = Kick.objects.all()
  54. for host in hosts:
  55. host.connection_fails = host.connection_attempts - host.connection_succeeds
  56. context = {
  57. 'parent_title': 'Networks',
  58. 'parent_url': reverse('rotbot:networks'),
  59. 'parent_icon': 'robot',
  60. 'title': network.name,
  61. 'icon': 'sitemap',
  62. 'description': 'Details of ' + network.name,
  63. 'keywords': default_keywords() + 'network.name, display, details',
  64. 'network': network,
  65. 'hosts': hosts,
  66. 'channels': channels,
  67. 'total_hosts': shorten_number(hosts.count()),
  68. 'total_chanels': shorten_number(channels.count()),
  69. 'total_users': shorten_number(users.count()),
  70. 'total_messages': shorten_number(total_messages(messages)),
  71. 'total_actions': shorten_number(total_messages(actions)),
  72. 'total_notices': shorten_number(total_messages(notices)),
  73. 'total_joins': shorten_number(joins.count()),
  74. 'total_kicks': shorten_number(kicks.count()),
  75. }
  76. return render(request, 'rotbot/network.html', context)
  77. @login_required
  78. @permission_required('rotbot.change_network', raise_exception=True)
  79. def edit_network(request, network_slug):
  80. network = get_object_or_404(Network, slug=network_slug)
  81. title = network.name
  82. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  83. if request.method == 'POST':
  84. form = NetworkForm(request.POST, instance=network)
  85. formset = HostFormSet(request.POST, instance=network)
  86. if form.is_valid() and formset.is_valid():
  87. form.save()
  88. formset.save()
  89. return HttpResponseRedirect(reverse('rotbot:network', args=(network.slug,)))
  90. else:
  91. form = NetworkForm(instance=network)
  92. formset = HostFormSet(instance=network)
  93. context = {
  94. 'parent_title': 'Networks',
  95. 'parent_url': reverse('rotbot:networks'),
  96. 'parent_icon': 'robot',
  97. 'title': title,
  98. 'icon': 'sitemap',
  99. 'description': 'Edit ' + title,
  100. 'keywords': default_keywords((title, 'edit')),
  101. 'network_slug': network_slug,
  102. 'form': form,
  103. 'hostformset': formset,
  104. }
  105. return render(request, 'rotbot/edit_network.html', context)
  106. @login_required
  107. @permission_required('rotbot.add_network', raise_exception=True)
  108. def add_network(request):
  109. HostFormSet = inlineformset_factory(Network, Host, form=HostForm)
  110. if request.method == 'POST':
  111. form = NetworkForm(request.POST)
  112. if form.is_valid():
  113. network = form.save()
  114. formset = HostFormSet(request.POST, instance=network)
  115. if formset.is_valid():
  116. formset.save()
  117. return HttpResponseRedirect(reverse('rotbot:network', args=(form.cleaned_data['slug'],)))
  118. else:
  119. formset = HostFormSet(queryset=Host.objects.none())
  120. else: # Not a POST request.
  121. form = NetworkForm()
  122. formset = HostFormSet(queryset=Host.objects.none())
  123. context = {
  124. 'parent_title': 'Networks',
  125. 'parent_url': reverse('rotbot:networks'),
  126. 'parent_icon': 'robot',
  127. 'title': 'Add network',
  128. 'icon': 'sitemap',
  129. 'description': 'Add new irc network to ' + APPLICATION_NAME,
  130. 'keywords': default_keywords() + 'add, add network',
  131. 'form': form,
  132. 'hostformset': formset,
  133. }
  134. return render(request, 'rotbot/add_network.html', context)
  135. @login_required
  136. @permission_required('rotbot.change_network', raise_exception=True)
  137. def delete_network(request, network_slug):
  138. network = get_object_or_404(Network, slug=network_slug)
  139. network.delete()
  140. return HttpResponseRedirect(reverse('rotbot:networks'))
  141. def channel(request, channel_slug):
  142. channel = get_object_or_404(Channel, slug=channel_slug)
  143. network = Network.objects.get(id=channel.network.id)
  144. messages = Message.objects.filter(channel=channel)
  145. actions = Action.objects.filter(channel=channel)
  146. notices = Notice.objects.filter(channel=channel)
  147. joins = Join.objects.filter(channel=channel)
  148. kicks = Kick.objects.filter(channel=channel)
  149. context = {
  150. 'parent_title': network.name,
  151. 'parent_url': reverse('rotbot:network', args=(network.slug,)),
  152. 'parent_icon': 'sitemap',
  153. 'title': channel.name,
  154. 'icon': 'hashtag',
  155. 'description': 'Details of channel %s on network %s' % (channel.name, network.name),
  156. 'keywords': default_keywords() + '%s, %s' % (network.name, channel.name),
  157. 'channel': channel,
  158. 'network': network,
  159. 'total_messages': shorten_number(total_messages(messages)),
  160. 'total_actions': shorten_number(total_messages(actions)),
  161. 'total_notices': shorten_number(total_messages(notices)),
  162. 'total_joins': shorten_number(joins.count()),
  163. 'total_kicks': shorten_number(kicks.count()),
  164. }
  165. return render(request, 'rotbot/channel.html', context)
  166. @login_required
  167. @permission_required('rotbot.change_channel', raise_exception=True)
  168. def channel_settings(request, channel_slug):
  169. channel = get_object_or_404(Channel, slug=channel_slug)
  170. network = Network.objects.get(id=channel.network_id)
  171. if request.method == 'POST':
  172. form = ChannelForm(request.POST, instance=channel)
  173. if form.is_valid():
  174. form.save()
  175. return HttpResponseRedirect(reverse('rotbot:channel', args=(channel.slug,)))
  176. else:
  177. form = ChannelForm(instance=channel)
  178. context = {
  179. 'parent_title': network.name,
  180. 'parent_url': reverse('rotbot:network', args=(network.slug,)),
  181. 'parent_icon': 'sitemap',
  182. 'title': channel.name,
  183. 'icon': 'hashtag',
  184. 'description': 'Change settings for channel %s on network %s' % (channel.name, network.name),
  185. 'keywords': default_keywords() + 'settings, %s, %s' % (network.name, channel.name),
  186. 'channel_slug': channel.slug,
  187. 'network_slug': network.slug,
  188. 'form': form,
  189. }
  190. return render(request, 'rotbot/channel_settings.html', context)
  191. def ircauth_channel_settings(request, temp_key):
  192. key = get_object_or_404(TempChannelKey, key=temp_key)
  193. channel = Channel.objects.get(id=key.channel_id)
  194. network = Network.objects.get(id=key.network_id)
  195. if key.created > datetime.datetime.now() - datetime.timedelta(minute=10):
  196. key_expired = False
  197. else:
  198. key_expired = True
  199. if request.method == 'POST':
  200. if recent_key:
  201. form = ChannelForm(request.POST, instance=channel)
  202. if form.is_valid():
  203. form.save()
  204. key.delete()
  205. return HttpResponseRedirect(reverse('rotbot:channel', args=(channel.slug,)))
  206. else:
  207. form = ChannelForm(instance=channel)
  208. context = {
  209. 'parent_title': network.name,
  210. 'parent_url': reverse('rotbot:network', args=(network.slug,)),
  211. 'parent_icon': 'sitemap',
  212. 'title': channel.name,
  213. 'icon': 'hashtag',
  214. 'description': 'Change settings for channel %s on network %s' % (channel.name, network.name),
  215. 'keywords': default_keywords() + 'settings, %s, %s' % (network.name, channel.name),
  216. 'channel_slug': channel.slug,
  217. 'network_slug': network.slug,
  218. 'form': form,
  219. 'temp_key': temp_key,
  220. 'key_expired': key_expired,
  221. }
  222. return render(request, 'rotbot/channel_settings.html', context)
  223. def user(request, user_slug):
  224. user = get_object_or_404(User, slug=user_slug)
  225. network = Network.objects.get(id=user.network.id)
  226. messages = Message.objects.filter(user=user)
  227. actions = Action.objects.filter(user=user)
  228. notices = Notice.objects.filter(user=user)
  229. joins = Join.objects.filter(user=user)
  230. kicks = Kick.objects.filter(kicker=user)
  231. kicked = Kick.objects.filter(kicked=user)
  232. context = {
  233. 'parent_title': network.name,
  234. 'parent_url': reverse('rotbot:network', args=(network.slug,)),
  235. 'parent_icon': 'sitemap',
  236. 'title': user.name,
  237. 'icon': 'hashtag',
  238. 'description': 'Details of user %s on network %s' % (user.name, network.name),
  239. 'keywords': default_keywords() + '%s, %s' % (network.name, user.name),
  240. 'user': user,
  241. 'network': network,
  242. 'total_messages': shorten_number(total_messages(messages)),
  243. 'total_actions': shorten_number(total_messages(actions)),
  244. 'total_notices': shorten_number(total_messages(notices)),
  245. 'total_joins': shorten_number(joins.count()),
  246. 'total_kicks': shorten_number(kicked.count()),
  247. 'total_kicked': shorten_number(kicked.count()),
  248. }
  249. return render(request, 'rotbot/user.html', context)
  250. # Helpers
  251. def total_messages(messages):
  252. total_messages = 0
  253. for message in messages:
  254. total_messages += message.amount
  255. return total_messages
  256. def shorten_number (number):
  257. if len(str(number)) > 20:
  258. number = str(int(number /1000000000000000000)) +"E"
  259. elif len(str(number)) > 17:
  260. number = str(int(number /1000000000000000)) +"P"
  261. elif len(str(number)) > 14:
  262. number = str(int(number /1000000000000)) +"T"
  263. elif len(str(number)) > 11:
  264. number = str(int(number /1000000000)) +"G"
  265. elif len(str(number)) > 8:
  266. number = str(int(number /1000000)) +"M"
  267. elif len(str(number)) > 5:
  268. number = str(int(number /1000)) + "K"
  269. elif len(str(number)) > 4:
  270. number = str(int(number /100)) + "h"
  271. else:
  272. number = int(number)
  273. return str(number)