index.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import json
  2. import requests
  3. from requests.exceptions import RequestException
  4. from django.contrib.auth import get_user_model
  5. from django.http import Http404, JsonResponse
  6. from django.utils.six.moves import range
  7. from django.utils.translation import ugettext as _
  8. from misago import __version__
  9. from misago.core.cache import cache
  10. from misago.threads.models import Post, Thread
  11. from . import render
  12. VERSION_CHECK_CACHE_KEY = "misago_version_check"
  13. UserModel = get_user_model()
  14. def admin_index(request):
  15. db_stats = {
  16. 'threads': Thread.objects.count(),
  17. 'posts': Post.objects.count(),
  18. 'users': UserModel.objects.count(),
  19. 'inactive_users': UserModel.objects.exclude(
  20. requires_activation=UserModel.ACTIVATION_NONE
  21. ).count()
  22. }
  23. return render(request, 'misago/admin/index.html', {
  24. 'db_stats': db_stats,
  25. 'version_check': cache.get(VERSION_CHECK_CACHE_KEY)
  26. })
  27. def check_version(request):
  28. if request.method != "POST":
  29. raise Http404()
  30. version = cache.get(VERSION_CHECK_CACHE_KEY, 'nada')
  31. if version == 'nada':
  32. try:
  33. api_url = 'https://api.github.com/repos/rafalp/Misago/releases'
  34. r = requests.get(api_url)
  35. if r.status_code != requests.codes.ok:
  36. r.raise_for_status()
  37. latest_version = json.loads(r.content)[0]['tag_name']
  38. latest = [int(v) for v in latest_version.split(".")]
  39. current = [int(v) for v in __version__.split(".")]
  40. for i in range(3):
  41. if latest[i] > current[i]:
  42. message = _("Outdated: %(current)s < %(latest)s")
  43. formats = {
  44. 'latest': latest_version,
  45. 'current': __version__
  46. }
  47. version = {
  48. 'is_error': True,
  49. 'message': message % formats
  50. }
  51. break
  52. else:
  53. formats = {'current': __version__}
  54. version = {
  55. 'is_error': False,
  56. 'message': _("Up to date! (%(current)s)") % formats,
  57. }
  58. cache.set(VERSION_CHECK_CACHE_KEY, version, 180)
  59. except (RequestException, IndexError, KeyError, ValueError):
  60. message = _("Failed to connect to GitHub API. Try again later.")
  61. version = {
  62. 'is_error': True,
  63. 'message': message
  64. }
  65. return JsonResponse(version)