index.py 2.3 KB

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