diff --git a/fargo/fargo/views.py b/fargo/fargo/views.py index c14038f..b9912c1 100644 --- a/fargo/fargo/views.py +++ b/fargo/fargo/views.py @@ -34,6 +34,7 @@ from django.contrib.auth import views as auth_views from django.utils.http import quote from django.utils.translation import ugettext as _ from django.utils.decorators import method_decorator +from django.utils.functional import cached_property from django.conf import settings from django_tables2 import SingleTableMixin @@ -53,7 +54,22 @@ class Logger(object): self.logger = logging.getLogger(__name__) -class CommonUpload(Logger, CreateView): +class Documents(object): + def get_queryset(self): + return models.UserDocument.objects \ + .filter(user=self.request.user) \ + .select_related('document', 'user') + + @cached_property + def count(self): + return self.get_queryset().filter(origin__isnull=True).count() + + @cached_property + def full(self): + return self.count >= settings.FARGO_MAX_DOCUMENTS_PER_USER + + +class CommonUpload(Logger, Documents, CreateView): form_class = forms.UploadForm model = models.UserDocument template_name = 'fargo/upload.html' @@ -77,20 +93,18 @@ class Upload(CommonUpload): homepage = reverse('home') return self.request.GET.get(REDIRECT_FIELD_NAME, homepage) + def dispatch(self, request, *args, **kwargs): + if self.full: + return HttpResponseRedirect(self.get_success_url()) + return super(Upload, self).dispatch(request, *args, **kwargs) + def post(self, request, *args, **kwargs): if 'cancel' in request.POST: return HttpResponseRedirect(self.get_success_url()) return super(Upload, self).post(request, *args, **kwargs) -class Documents(object): - def get_queryset(self): - return models.UserDocument.objects \ - .filter(user=self.request.user) \ - .select_related('document', 'user') - - -class Homepage(Documents, SingleTableMixin, CommonUpload): +class Homepage(SingleTableMixin, CommonUpload): '''Show documents of users, eventually paginate and sort them.''' template_name = 'fargo/home.html' form_class = forms.UploadForm @@ -108,8 +122,17 @@ class Homepage(Documents, SingleTableMixin, CommonUpload): max_size = ctx['max_portfolio_size'] = settings.FARGO_MAX_DOCUMENT_BOX_SIZE ctx['occupancy_ratio'] = float(occupancy) / max_size ctx['occupancy_ratio_percent'] = float(occupancy) * 100.0 / max_size + ctx['max_documents_per_user'] = settings.FARGO_MAX_DOCUMENTS_PER_USER + ctx['full'] = self.full + ctx['count'] = self.count return ctx + def post(self, request, *args, **kwargs): + if self.full: + return HttpResponseRedirect('') + return super(CommonUpload, self).post(request, *args, **kwargs) + + class PickView(object): def dispatch(self, request, *args, **kwargs): diff --git a/fargo/templates/fargo/home.html b/fargo/templates/fargo/home.html index 8fa78b3..2353253 100644 --- a/fargo/templates/fargo/home.html +++ b/fargo/templates/fargo/home.html @@ -44,6 +44,16 @@