1import logging
2
3from rest_framework import status
4from rest_framework.authentication import SessionAuthentication
5from rest_framework.permissions import IsAdminUser
6from rest_framework.response import Response
7from rest_framework.views import APIView
8
9from seaserv import seafile_api, ccnet_api
10
11from seahub.api2.authentication import TokenAuthentication
12from seahub.api2.throttling import UserRateThrottle
13from seahub.api2.utils import api_error
14
15from seahub.profile.models import Profile
16from seahub.utils.file_size import get_file_size_unit
17from seahub.utils.timeutils import datetime_to_isoformat_timestr
18from seahub.institutions.models import Institution, InstitutionQuota, InstitutionAdmin
19from seahub.institutions.utils import get_institution_space_usage
20from seahub.signals import institution_deleted
21
22logger = logging.getLogger(__name__)
23
24
25class AdminInstitutions(APIView):
26
27    authentication_classes = (TokenAuthentication, SessionAuthentication)
28    permission_classes = (IsAdminUser, )
29    throttle_classes = (UserRateThrottle, )
30
31    def get(self, request):
32        """List all Institutions
33        """
34
35        if not request.user.admin_permissions.other_permission():
36            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
37
38        try:
39            current_page = int(request.GET.get('page', '1'))
40            per_page = int(request.GET.get('per_page', '100'))
41        except ValueError:
42            current_page = 1
43            per_page = 100
44
45        start = per_page * (current_page - 1)
46        institutions = Institution.objects.all()[start:start + per_page]
47
48        count = Institution.objects.count()
49
50        institutions_info = []
51        for institution in institutions:
52            data = {}
53            data['id'] = institution.id
54            data['name'] = institution.name
55            data['ctime'] = datetime_to_isoformat_timestr(institution.create_time)
56            institutions_info.append(data)
57
58        resp = {
59            'institution_list': institutions_info,
60            'total_count': count,
61        }
62        return Response(resp)
63
64    def post(self, request):
65        """Create an Institution
66        """
67
68        if not request.user.admin_permissions.other_permission():
69            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
70
71        name = request.data.get('name', '').strip()
72        if not name:
73            error_msg = 'name invalid.'
74            return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
75
76        try:
77            institution = Institution.objects.add_institution(name=name)
78        except Exception as e:
79            logger.error(e)
80            error_msg = 'Internal Server Error'
81            return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
82
83        info = {}
84        info['id'] = institution.id
85        info['name'] = institution.name
86        info['ctime'] = datetime_to_isoformat_timestr(institution.create_time)
87
88        return Response(info)
89
90
91class AdminInstitution(APIView):
92
93    authentication_classes = (TokenAuthentication, SessionAuthentication)
94    permission_classes = (IsAdminUser, )
95    throttle_classes = (UserRateThrottle, )
96
97    def get(self, request, institution_id):
98        """Get an Institution's info
99        """
100
101        if not request.user.admin_permissions.other_permission():
102            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
103
104        try:
105            institution = Institution.objects.get(id=institution_id)
106        except Exception as e:
107            logger.error(e)
108            error_msg = "institution %s not found." % institution_id
109            return api_error(status.HTTP_404_NOT_FOUND, error_msg)
110
111        info = {}
112        info['id'] = institution.id
113        info['name'] = institution.name
114        info['user_count'] = Profile.objects.filter(institution=institution.name).count()
115
116        info['quota_total'] = InstitutionQuota.objects.get_or_none(institution=institution)
117        info['quota_used'] = get_institution_space_usage(institution)
118
119        return Response(info)
120
121    def put(self, request, institution_id):
122        """Update (quota) of institution
123        """
124
125        if not request.user.admin_permissions.other_permission():
126            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
127
128        try:
129            institution = Institution.objects.get(id=institution_id)
130        except Exception as e:
131            logger.error(e)
132            error_msg = "institution %s not found." % institution_id
133            return api_error(status.HTTP_404_NOT_FOUND, error_msg)
134
135        quota_mb = request.data.get('quota', '')
136        try:
137            quota_mb = int(quota_mb)
138        except Exception as e:
139            logger.error(e)
140            error_msg = 'quota invalid.'
141            return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
142
143        quota = quota_mb * get_file_size_unit('MB')
144
145        try:
146            InstitutionQuota.objects.update_or_create(
147                institution=institution,
148                defaults={'quota': quota},
149            )
150        except Exception as e:
151            logger.error(e)
152            error_msg = 'Internal Server Error'
153            return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
154
155        info = {}
156        info['id'] = institution.id
157        info['name'] = institution.name
158        info['user_count'] = Profile.objects.filter(institution=institution.name).count()
159
160        info['quota_total'] = InstitutionQuota.objects.get_or_none(institution=institution)
161        info['quota_used'] = get_institution_space_usage(institution)
162
163        return Response(info)
164
165    def delete(self, request, institution_id):
166        """Delete an Institution
167        """
168
169        if not request.user.admin_permissions.other_permission():
170            return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
171
172        try:
173            institution = Institution.objects.get(id=institution_id)
174        except Exception as e:
175            logger.error(e)
176            error_msg = "institution %s not found." % institution_id
177            return api_error(status.HTTP_404_NOT_FOUND, error_msg)
178
179        try:
180            institution.delete()
181        except Exception as e:
182            logger.error(e)
183            error_msg = 'Internal Server Error'
184            return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
185
186        # delete user and admin in institution
187        institution_deleted.send(sender=None, inst_name=institution.name)
188        return Response({'success': True})
189