import requests from requests.exceptions import RequestException from django.contrib.auth import get_user_model from django.http import Http404, JsonResponse from django.utils.translation import gettext as _ from misago import __version__ from misago.conf import settings from misago.core.cache import cache from misago.threads.models import Post, Thread from . import render VERSION_CHECK_CACHE_KEY = "misago_version_check" UserModel = get_user_model() def admin_index(request): inactive_users_queryset = UserModel.objects.exclude( requires_activation=UserModel.ACTIVATION_NONE, ) db_stats = { 'threads': Thread.objects.count(), 'posts': Post.objects.count(), 'users': UserModel.objects.count(), 'inactive_users': inactive_users_queryset.count() } return render( request, 'misago/admin/index.html', { 'db_stats': db_stats, 'address_check': check_misago_address(request), 'version_check': cache.get(VERSION_CHECK_CACHE_KEY), } ) def check_misago_address(request): set_address = settings.MISAGO_ADDRESS correct_address = request.build_absolute_uri('/') return { 'is_correct': set_address == correct_address, 'set_address': set_address, 'correct_address': correct_address, } def check_version(request): if request.method != "POST": raise Http404() version = cache.get(VERSION_CHECK_CACHE_KEY, 'nada') if version == 'nada': try: api_url = 'https://pypi.org/pypi/Misago/json' r = requests.get(api_url) r.raise_for_status() latest_version = r.json()['info']['version'] if latest_version == __version__: version = { 'is_error': False, 'message': _("Up to date! (%(current)s)") % { 'current': __version__, }, } else: version = { 'is_error': True, 'message': _("Outdated: %(current)s! (latest: %(latest)s)") % { 'latest': latest_version, 'current': __version__, }, } cache.set(VERSION_CHECK_CACHE_KEY, version, 180) except (RequestException, IndexError, KeyError, ValueError) as e: version = { 'is_error': True, 'message': _("Failed to connect to pypi.org API. Try again later."), } return JsonResponse(version)