def get(self, request): """Return feature prompt status if dismissed or in snoozed period""" features = request.GET.getlist("feature") if len(features) == 0: return Response({"details": "No feature specified"}, status=400) conditions = None for feature in features: if not prompt_config.has(feature): return Response({"detail": "Invalid feature name " + feature}, status=400) required_fields = prompt_config.required_fields(feature) for field in required_fields: if field not in request.GET: return Response({"detail": 'Missing required field "%s"' % field}, status=400) filters = {k: request.GET.get(k) for k in required_fields} condition = Q(feature=feature, **filters) conditions = condition if conditions is None else (conditions | condition) result = PromptsActivity.objects.filter(conditions, user=request.user) featuredata = {k.feature: k.data for k in result} if len(features) == 1: result = result.first() data = None if result is None else result.data return Response({"data": data, "features": featuredata}) else: return Response({"features": featuredata})
def get(self, request): """ Return feature prompt status if dismissed or in snoozed period""" feature = request.GET.get("feature") if not prompt_config.has(feature): return Response({"detail": "Invalid feature name"}, status=400) required_fields = prompt_config.required_fields(feature) for field in required_fields: if field not in request.GET: return Response( {"detail": 'Missing required field "%s"' % field}, status=400) filters = {k: request.GET.get(k) for k in required_fields} try: result = PromptsActivity.objects.get(user=request.user, feature=feature, **filters) except PromptsActivity.DoesNotExist: return Response({}) return Response({"data": result.data})
def put(self, request): serializer = PromptsActivitySerializer(data=request.data) if not serializer.is_valid(): return Response(serializer.errors, status=400) serialized = serializer.validated_data feature = serialized["feature"] status = serialized["status"] required_fields = prompt_config.required_fields(feature) fields = {k: request.data.get(k) for k in required_fields} if any(elem is None for elem in fields.values()): return Response({"detail": "Missing required field"}, status=400) # if project_id or organization_id in required fields make sure they exist # if NOT in required fields, insert dummy value so dups aren't recorded if "project_id" in required_fields: if not Project.objects.filter(id=fields["project_id"]).exists(): return Response({"detail": "Project no longer exists"}, status=400) else: fields["project_id"] = 0 if "organization_id" in required_fields: if not Organization.objects.filter( id=fields["organization_id"]).exists(): return Response({"detail": "Organization no longer exists"}, status=400) else: fields["organization_id"] = 0 data = {} now = calendar.timegm(timezone.now().utctimetuple()) if status == "snoozed": data["snoozed_ts"] = now elif status == "dismissed": data["dismissed_ts"] = now try: with transaction.atomic(): PromptsActivity.objects.create_or_update(feature=feature, user=request.user, values={"data": data}, **fields) except IntegrityError: pass return HttpResponse(status=201)