def list(self, request): """ Retrieves all projects for a given organization. :GET: Expects organization_id in query string. parameters: - name: organization_id description: The organization_id for this user's organization required: true paramType: query Returns:: { 'status': 'success', 'projects': [ { 'id': project's primary key, 'name': project's name, 'slug': project's identifier, 'status': 'active', 'number_of_buildings': Count of buildings associated with project 'last_modified': Timestamp when project last changed 'last_modified_by': { 'first_name': first name of user that made last change, 'last_name': last name, 'email': email address, }, 'is_compliance': True if project is a compliance project, 'compliance_type': Description of compliance type, 'deadline_date': Timestamp of when compliance is due, 'end_date': Timestamp of end of project, 'property_count': number of property views associated with project, 'taxlot_count': number of taxlot views associated with project, }... ] } """ projects = [ ProjectSerializer(proj).data for proj in self.get_queryset() ] status_code = status.HTTP_200_OK result = { 'status': 'success', 'projects': projects } return Response(result, status=status_code)
def partial_update(self, request, pk): """ Updates a project. Allows partial update, i.e. only updated param s need be supplied. :PUT: Expects organization_id in query string. --- parameters: - name: organization_id description: ID of organization to associate new project with type: integer required: true paramType: query - name: project slug or pk description: The project slug identifier or primary key for this project required: true paramType: path - name: name description: name of the new project type: string required: false - name: is_compliance description: add compliance data if true type: bool required: false - name: compliance_type description: description of type of compliance type: string required: true if is_compliance else false - name: description description: description of new project type: string required: true if is_compliance else false - name: end_date description: Timestamp for when project ends type: string required: true if is_compliance else false - name: deadline_date description: Timestamp for compliance deadline type: string required: true if is_compliance else false Returns:: { 'status': 'success', 'project': { 'id': project's primary key, 'name': project's name, 'slug': project's identifier, 'status': 'active', 'number_of_buildings': Count of buildings associated with project 'last_modified': Timestamp when project last changed 'last_modified_by': { 'first_name': first name of user that made last change, 'last_name': last name, 'email': email address, }, 'is_compliance': True if project is a compliance project, 'compliance_type': Description of compliance type, 'deadline_date': Timestamp of when compliance is due, 'end_date': Timestamp of end of project, 'property_count': number of property views associated with project, 'taxlot_count': number of taxlot views associated with project, } } """ error = None status_code = status.HTTP_200_OK project_data, _ = self.get_params(PROJECT_KEYS) project_data['last_modified_by'] = request.user if 'status' in project_data: # convert to int equivalent project_data['status'] = self.get_status(project_data['status']) is_compliance = project_data.pop('is_compliance', None) if is_compliance: compliance_data, _ = self.get_params(COMPLIANCE_KEYS) compliance_data = convert_dates( compliance_data, ['end_date', 'deadline_date'] ) key = self.get_key(pk) project = self.get_project(key, pk) if not project: error, status_code = self.get_error( 'not found', key=key, val=pk ) else: project = project[0] compliance = project.get_compliance() if is_compliance: if not compliance: compliance = Compliance(project=project) compliance = update_model( compliance, compliance_data ) project = update_model(project, project_data) if is_compliance: compliance.save() # delete compliance if one exists elif is_compliance == 'False': compliance.delete() project.save() if error: result = {'status': 'error', 'message': error} else: result = { 'status': 'success', 'project': ProjectSerializer(project).data } return Response(result, status=status_code)
def create(self, request): """ Creates a new project :POST: Expects organization_id in query string. --- parameters: - name: organization_id description: ID of organization to associate new project with type: integer required: true paramType: query - name: name description: name of the new project type: string required: true - name: is_compliance description: add compliance data if true type: bool required: true - name: compliance_type description: description of type of compliance type: string required: true if is_compliance else false - name: description description: description of new project type: string required: true if is_compliance else false - name: end_date description: Timestamp for when project ends type: string required: true if is_compliance else false - name: deadline_date description: Timestamp for compliance deadline type: string required: true if is_compliance else false Returns:: { 'status': 'success', 'project': { 'id': project's primary key, 'name': project's name, 'slug': project's identifier, 'status': 'active', 'number_of_buildings': Count of buildings associated with project 'last_modified': Timestamp when project last changed 'last_modified_by': { 'first_name': first name of user that made last change, 'last_name': last name, 'email': email address, }, 'is_compliance': True if project is a compliance project, 'compliance_type': Description of compliance type, 'deadline_date': Timestamp of when compliance is due, 'end_date': Timestamp of end of project, 'property_count': 0, 'taxlot_count': 0, } } """ error = None status_code = status.HTTP_200_OK super_organization_id = self.get_organization() project_data, missing = self.get_params(PROJECT_KEYS) project_data.update({ 'owner': request.user, 'super_organization_id': super_organization_id, }) is_compliance = project_data.pop('is_compliance', None) if missing: error, status_code = self.get_error( 'missing param', key=", ".join(missing) ) else: try: # convert to int equivalent project_data['status'] = self.get_status(project_data['status']) except KeyError: error, status_code = self.get_status( 'bad request', key='status' ) if not error and is_compliance: compliance_data, missing = self.get_params( COMPLIANCE_KEYS ) if missing: error, status_code = self.get_error( 'missing param', key=", ".join(missing) ) else: compliance_data = convert_dates( compliance_data, ['end_date', 'deadline_date'] ) if not error and Project.objects.filter( name=project_data['name'], super_organization_id=super_organization_id ).exists(): error, status_code = self.get_error( 'conflict', key='project', val='organization' ) if not error: if Project.objects.filter( name=project_data['name'], owner=request.user, super_organization_id=super_organization_id, ).exists(): error, status_code = self.get_error( 'conflict', key='organization/user' ) else: project = Project.objects.create(**project_data) if is_compliance: compliance_data['project'] = project Compliance.objects.create(**compliance_data) if error: result = {'status': 'error', 'message': error} else: result = { 'status': 'success', 'project': ProjectSerializer(project).data } return Response(result, status=status_code)
def retrieve(self, request, pk): """ Retrieves details about a project. :GET: Expects organization_id in query string. --- parameter_strategy: replace parameters: - name: organization_id description: The organization_id for this user's organization required: true paramType: query - name: project slug or pk description: The project slug identifier or primary key for this project required: true paramType: path Returns:: { 'id': project's primary key, 'name': project's name, 'slug': project's identifier, 'status': 'active', 'number_of_buildings': Count of buildings associated with project 'last_modified': Timestamp when project last changed 'last_modified_by': { 'first_name': first name of user that made last change, 'last_name': last name, 'email': email address, }, 'is_compliance': True if project is a compliance project, 'compliance_type': Description of compliance type, 'deadline_date': Timestamp of when compliance is due, 'end_date': Timestamp of end of project 'property_count': number of property views associated with project, 'taxlot_count': number of taxlot views associated with project, 'property_views': [list of serialized property views associated with the project...], 'taxlot_views': [list of serialized taxlot views associated with the project...], } """ error = None status_code = status.HTTP_200_OK key = self.get_key(pk) project = self.get_project(key, pk) cycle = request.query_params.get('cycle', None) if not project: error, status_code = self.get_error( 'not found', key=key, val=pk ) result = {'status': 'error', 'message': error} else: project = project[0] property_views = project.property_views.all() taxlot_views = project.taxlot_views.all() if cycle: property_views = property_views.filter( cycle_id=cycle ) taxlot_views = taxlot_views.filter( cycle_id=cycle ) project_data = ProjectSerializer(project).data project_data['property_views'] = [ PropertyViewSerializer(property_view).data for property_view in property_views ] project_data['taxlot_views'] = [ TaxLotViewSerializer(taxlot_view).data for taxlot_view in taxlot_views ] result = { 'status': 'success', 'project': project_data, } return Response(result, status=status_code)