Beispiel #1
0
    def list(self, request):
        """
        this method returns list of adgroups and if 'q' as query parameter
        is given it will filter objects with given query and returns list
        """
        q = request.GET.get("q", "")
        self.queryset = self.get_queryset()

        if q:
            q_list = q.split(" ")
            category_filter = reduce(
                operator.or_, [Q(category__name__icontains=s) for s in q_list])
            campaign_filter = reduce(
                operator.or_, [Q(campaign__name__icontains=s) for s in q_list])
            self.queryset = self.queryset.filter(category_filter
                                                 | campaign_filter).distinct()

        page = self.paginate_queryset(self.queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            if serializer.data:
                paginated_response = self.get_paginated_response(
                    serializer.data)
                return Response(create_response(paginated_response.data))

        serializer = self.get_serializer(self.queryset, many=True)
        return Response(create_response(serializer.data))
Beispiel #2
0
 def retrieve(self, request, pk=None):
     """
     this method returns single adgroup object for given pk value
     if object not found it will return error
     """
     obj = self.get_object()
     serializer = self.get_serializer(obj)
     return Response(create_response(serializer.data))
Beispiel #3
0
 def destroy(self, request, pk=None):
     """
     this method is used to delete Advertisement object
     """
     obj = self.get_object()
     obj.delete()
     return Response(create_response(
         {"Msg": "Advertisement deleted successfully"}),
                     status=200)
Beispiel #4
0
 def create(self, request):
     """
     this method is used to create new adgroup object
     """
     serializer = AdGroupSerializer(data=request.data)
     if serializer.is_valid():
         serializer.save()
         return Response(create_response(serializer.data))
     return Response(create_error_response(serializer.errors), status=400)
Beispiel #5
0
 def update(self, request, pk=None):
     """
     this method is used to update existing adgroup
     """
     obj = AdGroup.objects.get(id=pk)
     serializer = AdGroupSerializer(obj, data=request.data)
     if serializer.is_valid():
         serializer.save()
         return Response(create_response(serializer.data))
     return Response(create_error_response(serializer.errors), status=400)
Beispiel #6
0
    def get(self, request):
        domain_id = self.request.GET.get("domain")
        if not domain_id:
            return Response(
                create_error_response({"domain": ["Domain id is required"]}))

        domain = Domain.objects.filter(domain_id=domain_id).first()
        if not domain:
            return Response(
                create_error_response({"domain": ["Domain id is required"]}))

        ads = Advertisement.objects.filter(adgroup__campaign__domain=domain,
                                           is_active=True).order_by('?')
        if ads:
            ad = ads[random.randint(0, len(ads) - 1)]
            ad.delivered += 1
            ad.save()
            ad_serializer = AdvertisementSerializer(
                ad, context={"request": request})
            return Response(create_response(ad_serializer.data))
        return Response(create_response({}))
Beispiel #7
0
 def create(self, request):
     """
     this method is used to create new campaign object
     """
     post_data = request.data.copy()
     if request.user.domain:
         post_data["domain"] = request.user.domain.id
     serializer = CampaignSerializer(data=post_data)
     if serializer.is_valid():
         serializer.save()
         return Response(create_response(serializer.data))
     return Response(create_error_response(serializer.errors), status=400)
Beispiel #8
0
 def get(self, request, format=None, *args, **kwargs):
     """
     List all news category
     """
     domain = request.user.domain
     groups = GetAdGroupSerializer(
         AdGroup.objects.filter(campaign__domain=domain), many=True)
     types = AdTypeSerializer(AdType.objects.all(), many=True)
     return Response(
         create_response({
             "groups": groups.data,
             "types": types.data
         }))
Beispiel #9
0
 def create(self, request):
     """
     this method is used to create new adgroup object
     """
     file_obj = request.data['file']
     serializer = AdSerializer(data=request.data)
     if serializer.is_valid():
         obj = serializer.save()
         if file_obj:
             obj.media = file_obj
             obj.save()
         return Response(create_response(serializer.data))
     return Response(create_error_response(serializer.errors), status=400)
Beispiel #10
0
 def update(self, request, pk=None):
     """
     this method is used to update existing adgroup
     """
     file = request.data['file']
     advertisment = Advertisement.objects.get(id=pk)
     serializer = AdSerializer(advertisment, data=request.data)
     # import pdb
     # pdb.set_trace()
     if serializer.is_valid():
         updated = serializer.save()
         if file:
             updated.media = file
             updated.save()
         return Response(create_response(serializer.data))
     return Response(create_error_response(serializer.errors), status=400)
Beispiel #11
0
 def get(self, request, format=None, *args, **kwargs):
     """
     List all news category
     """
     current_date = datetime.datetime.now()
     categories = CategorySerializer(Category.objects.all(), many=True)
     campaigns = CampaignSerializer(Campaign.objects.filter(
         domain=request.user.domain,
         is_active=True,
         start_date__lte=current_date,
         end_date__gte=current_date),
                                    many=True)
     return Response(
         create_response({
             "categories": categories.data,
             "campaigns": campaigns.data
         }))
Beispiel #12
0
    def get(self, request):

        date_range = request.GET.get("date_range")
        start_date, end_date, error = self.get_date_range(date_range)
        if error:
            return Response(error, status=400)

        if not request.user.domain:
            data = [{"name": None, "article_count": 0}]
            no_data = True
            avg = {"avg_count": 0}
            return Response(
                create_response({
                    "result": data,
                    "no_data": no_data,
                    "avg_count": avg["avg_count"]
                }))

        domain_id = request.user.domain.domain_id

        pipeline = [{
            "$match": {
                "$and": [{
                    "ts": {
                        "$gte": start_date,
                        "$lte": end_date
                    }
                }, {
                    "domain": domain_id
                }]
            }
        }, {
            "$match": {
                "$or": [{
                    "action": "article_detail"
                }, {
                    "action": "article_search_details"
                }]
            }
        }, {
            "$group": {
                "_id": "$author_name",
                "count": {
                    "$sum": 1
                }
            }
        }, {
            "$project": {
                "_id": 0,
                "name": "$_id",
                "article_count": "$count"
            }
        }]

        data = list(self.events.collection.aggregate(pipeline))
        no_data = False
        if not data:
            data = [{"name": None, "article_count": 0}]
            no_data = True
            avg = {"avg_count": 0}
            past_avg = {"avg_count": 0}
        else:
            past_start_date, past_end_date, error = self.get_past_range(
                date_range)
            past_avg = self.get_avg(past_start_date, past_end_date, domain_id)
            avg = self.get_avg(start_date, end_date, domain_id)
        return Response(
            create_response({
                "result":
                data,
                "no_data":
                no_data,
                "avg_count":
                avg["avg_count"],
                "diff":
                round(avg["avg_count"] - past_avg["avg_count"], 2)
            }))
Beispiel #13
0
    def get(self, request):
        date_range = request.GET.get("date_range")
        start_date, end_date, error = self.get_date_range(date_range)
        if error:
            return Response(error, status=400)

        if not request.user.domain:
            res = {"dateStr": None, "web": 0, "android": 0, "ios": 0}
            no_data = True
            avg = {"avg_count": 0}
            return Response(
                create_response({
                    "result": res,
                    "no_data": no_data,
                    "avg_count": avg["avg_count"]
                }))

        domain_id = request.user.domain.domain_id

        pipeline = [{
            "$match": {
                "$and": [{
                    "ts": {
                        "$gte": start_date,
                        "$lte": end_date
                    }
                }, {
                    "domain": domain_id
                }]
            }
        }, {
            "$match": {
                "$or": [{
                    "action": "article_detail"
                }, {
                    "action": "article_search_details"
                }]
            }
        }, {
            "$project": {
                "_id": 0,
                "datePartDay": {
                    "$concat": [{
                        "$substr": [{
                            "$dayOfMonth": "$ts"
                        }, 0, 2]
                    }, "-", {
                        "$substr": [{
                            "$month": "$ts"
                        }, 0, 2]
                    }, "-", {
                        "$substr": [{
                            "$year": "$ts"
                        }, 0, 4]
                    }]
                },
                "platform": "$platform"
            }
        }, {
            "$group": {
                "_id": {
                    "datePartDay": "$datePartDay",
                    "platform": "$platform"
                },
                "count": {
                    "$sum": 1
                }
            }
        }, {
            "$project": {
                "_id": 0,
                "dateObj": {
                    "$dateFromString": {
                        "dateString": "$_id.datePartDay"
                    }
                },
                "count": "$count",
                "platform": "$_id.platform",
                "dateStr": "$_id.datePartDay"
            }
        }, {
            "$sort": {
                "dateObj": 1
            }
        }]

        data = list(self.events.collection.aggregate(pipeline))
        if data:
            res = []
            past_start_date, past_end_date, error = self.get_past_range(
                date_range)
            past_avg = self.get_avg(past_start_date, past_end_date, domain_id)
            for key, values in groupby(data, itemgetter("dateStr")):
                d = {"dateStr": key}
                for v in values:
                    d[v["platform"]] = v["count"]
                res.append(d)
            no_data = False
            avg = self.get_avg(start_date, end_date, domain_id)
        else:
            res = {"dateStr": None, "web": 0, "android": 0, "ios": 0}
            no_data = True
            avg = {"avg_count": 0}
            past_avg = {"avg_count": 0}
        return Response(
            create_response({
                "result":
                res,
                "no_data":
                no_data,
                "diff":
                round(avg["avg_count"] - past_avg["avg_count"], 2),
                "avg_count":
                avg["avg_count"]
            }))
Beispiel #14
0
    def get(self, request):
        date_range = request.GET.get("date_range")
        start_date, end_date, error = self.get_date_range(date_range)
        if error:
            return Response(error, status=400)

        if not request.user.domain:
            res = {
                "data": [{
                    "dateStr": "0",
                    "dateObj": "0",
                    "count": 0
                }],
                "max": {
                    "count": None,
                    "dateStr": None
                },
                "dateStr": 0,
                "avg_count": 0
            }
            no_data = True
            avg = {"avg_count": 0}
            return Response(
                create_response({
                    "result": res,
                    "no_data": no_data,
                    "avg_count": avg["avg_count"]
                }))

        domain_id = request.user.domain.domain_id
        pipeline = self.pipeline(start_date, end_date, domain_id)
        data = list(self.events.collection.aggregate(pipeline))
        if data:

            def max_func(x):
                return x["count"]

            max_values = max(data, key=max_func)
            avg = self.get_avg(start_date, end_date, domain_id)
            past_start_date, past_end_date, error = self.get_past_range(
                date_range)
            past_avg = self.get_avg(past_start_date, past_end_date, domain_id)
            res = {
                "data": data,
                "max": {
                    "count": max_values["count"],
                    "dateStr": max_values["dateStr"]
                }
            }
            no_data = False
        else:
            res = {
                "data": [{
                    "dateStr": "0",
                    "dateObj": "0",
                    "count": 0
                }],
                "max": {
                    "count": None,
                    "dateStr": None
                },
                "dateStr": 0,
                "avg_count": 0
            }
            no_data = True
            avg = {"avg_count": 0}
            past_avg = {"avg_count": 0}
        return Response(
            create_response({
                "result":
                res,
                "no_data":
                no_data,
                "avg_count":
                avg["avg_count"],
                "diff":
                round(avg["avg_count"] - past_avg["avg_count"], 2)
            }))
Beispiel #15
0
    def get(self, request):

        date_range = request.GET.get("date_range")
        start_date, end_date, error = self.get_date_range(date_range)
        if error:
            return Response(error, status=400)

        if not request.user.domain:
            data = [{"dateStr": None, "avg_count": 0}]
            no_data = True
            avg = {"avg_count": 0}
            return Response(
                create_response({
                    "result": data,
                    "no_data": no_data,
                    "avg_count": avg["avg_count"]
                }))

        domain_id = request.user.domain.domain_id

        pipeline = [{
            "$match": {
                "$and": [{
                    "ts": {
                        "$gte": start_date,
                        "$lte": end_date
                    }
                }, {
                    "domain": domain_id
                }]
            }
        }, {
            "$project": {
                "_id": 0,
                "datePartDay": {
                    "$concat": [{
                        "$substr": [{
                            "$dayOfMonth": "$ts"
                        }, 0, 2]
                    }, "-", {
                        "$substr": [{
                            "$month": "$ts"
                        }, 0, 2]
                    }, "-", {
                        "$substr": [{
                            "$year": "$ts"
                        }, 0, 4]
                    }]
                },
                "sid": "$sid"
            }
        }, {
            "$group": {
                "_id": {
                    "datePartDay": "$datePartDay",
                    "sid": "$sid"
                },
                "count": {
                    "$sum": 1
                }
            }
        }, {
            "$project": {
                "_id": 0,
                "dateObj": {
                    "$dateFromString": {
                        "dateString": "$_id.datePartDay"
                    }
                },
                "count": "$count",
                "sid": "$_id.sid",
                "dateStr": "$_id.datePartDay"
            }
        }, {
            "$group": {
                "_id": "$dateStr",
                "avg_count": {
                    "$avg": "$count"
                }
            }
        }, {
            "$project": {
                "_id": 0,
                "dateStr": "$_id",
                "avg_count": {
                    "$round": ["$avg_count", 1]
                }
            }
        }, {
            "$sort": {
                "dateStr": -1
            }
        }]

        data = list(self.events.collection.aggregate(pipeline))
        no_data = False
        if not data:
            data = [{"dateStr": None, "avg_count": 0}]
            no_data = True
            avg = {"avg_count": 0}
            past_avg = {"avg_count": 0}
        else:
            past_start_date, past_end_date, error = self.get_past_range(
                date_range)
            past_avg = self.get_avg(past_start_date, past_end_date, domain_id)
            avg = self.get_avg(start_date, end_date, domain_id)
        return Response(
            create_response({
                "result":
                data,
                "no_data":
                no_data,
                "avg_count":
                avg["avg_count"],
                "diff":
                round(avg["avg_count"] - past_avg["avg_count"], 2)
            }))
Beispiel #16
0
    def get(self, request):

        date_range = request.GET.get("date_range")
        start_date, end_date, error = self.get_date_range(date_range)
        if error:
            return Response(error, status=400)

        if not request.user.domain:
            res = [{
                "author": None,
                "article_details": 0,
                "article_search_details": 0
            }]
            no_data = True
            avg = {"avg_count": 0}
            return Response(
                create_response({
                    "result": res,
                    "no_data": no_data,
                    "avg_count": avg["avg_count"]
                }))

        domain_id = request.user.domain.domain_id

        pipeline = [{
            "$match": {
                "$and": [{
                    "ts": {
                        "$gte": start_date,
                        "$lte": end_date
                    }
                }, {
                    "domain": domain_id
                }]
            }
        }, {
            "$match": {
                "$or": [{
                    "action": "article_detail"
                }, {
                    "action": "article_search_details"
                }]
            }
        }, {
            "$group": {
                "_id": {
                    "action": "$action",
                    "author_name": "$author_name"
                },
                "count": {
                    "$sum": 1
                }
            }
        }, {
            "$project": {
                "_id": 0,
                "author": "",
                "action": "$_id.action",
                "count": "$count"
            }
        }, {
            "$sort": {
                "author": 1
            }
        }]

        data = list(self.events.collection.aggregate(pipeline))
        if data:
            res = []
            past_start_date, past_end_date, error = self.get_past_range(
                date_range)
            past_avg = self.get_avg(past_start_date, past_end_date, domain_id)
            for key, values in groupby(data, itemgetter("author")):
                d = {"author": key}
                for v in values:
                    d[v["action"]] = v["count"]
                res.append(d)
            no_data = False
            avg = self.get_avg(start_date, end_date, domain_id)
        else:
            res = [{
                "author": None,
                "article_details": 0,
                "article_search_details": 0
            }]
            no_data = True
            avg = {"avg_count": 0}
            past_avg = {'avg_count': 0}
        return Response(
            create_response({
                "result":
                res,
                "no_data":
                no_data,
                "avg_count":
                avg["avg_count"],
                "diff":
                round(avg["avg_count"] - past_avg["avg_count"], 2)
            }))