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