Bläddra i källkod

store all reviews to database

Mohidul Islam 4 år sedan
förälder
incheckning
f997678852

+ 8 - 1
facebook_app/admin.py

@@ -9,5 +9,12 @@ class FacebookPageAdmin(admin.ModelAdmin):
     search_fields = ('name', 'id',)
     search_fields = ('name', 'id',)
 
 
 
 
+class FacebookReviewAdmin(admin.ModelAdmin):
+    fields = ('id', 'review_text', 'recommendation_type', 'create_time',)
+    list_display = ('id', 'page', 'recommendation_type', 'review_text', 'create_time')
+    list_filter = ['page', 'recommendation_type']
+    ordering = ['-create_time']
+
+
 admin.site.register(FacebookPage, FacebookPageAdmin)
 admin.site.register(FacebookPage, FacebookPageAdmin)
-admin.site.register(FacebookReview)
+admin.site.register(FacebookReview, FacebookReviewAdmin)

+ 3 - 1
facebook_app/migrations/0001_initial.py

@@ -1,6 +1,7 @@
-# Generated by Django 3.0.4 on 2020-06-30 12:32
+# Generated by Django 3.0.4 on 2020-07-01 14:10
 
 
 from django.db import migrations, models
 from django.db import migrations, models
+import django.db.models.deletion
 
 
 
 
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):
@@ -26,6 +27,7 @@ class Migration(migrations.Migration):
                 ('recommendation_type', models.BooleanField()),
                 ('recommendation_type', models.BooleanField()),
                 ('review_text', models.TextField(blank=True, null=True)),
                 ('review_text', models.TextField(blank=True, null=True)),
                 ('create_time', models.DateTimeField()),
                 ('create_time', models.DateTimeField()),
+                ('page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='facebook_app.FacebookPage')),
             ],
             ],
         ),
         ),
     ]
     ]

+ 2 - 1
facebook_app/models.py

@@ -7,7 +7,7 @@ class FacebookPage(models.Model):
     token = models.CharField(max_length=255)
     token = models.CharField(max_length=255)
 
 
     def __str__(self):
     def __str__(self):
-        return self.name
+        return self.name.split('-')[-1]
 
 
 
 
 class FacebookReview(models.Model):
 class FacebookReview(models.Model):
@@ -15,6 +15,7 @@ class FacebookReview(models.Model):
     recommendation_type = models.BooleanField()
     recommendation_type = models.BooleanField()
     review_text = models.TextField(blank=True, null=True)
     review_text = models.TextField(blank=True, null=True)
     create_time = models.DateTimeField()
     create_time = models.DateTimeField()
+    page = models.ForeignKey(FacebookPage, on_delete=models.CASCADE)
 
 
     def __str__(self):
     def __str__(self):
         return self.review_text
         return self.review_text

+ 39 - 12
facebook_app/review_utils.py

@@ -1,20 +1,47 @@
-import facebook
-from .models import FacebookPage
+import requests
+from .models import FacebookPage, FacebookReview
+
+BASE_URL = 'https://graph.facebook.com'
+
+
+RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
 
 
 
 
 def get_page_reviews(page_id):
 def get_page_reviews(page_id):
     token = FacebookPage.objects.get(id=page_id).token
     token = FacebookPage.objects.get(id=page_id).token
-    api = facebook.GraphAPI(access_token=token, version='3.1')
-    response = api.get_object(
-        id=page_id,
-        fields='ratings.fields(open_graph_story,reviewer)'
-    )
-    # reviews has two fields ['ratings', 'id']
-    ratings = response.get('ratings')
+    url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}'
+    response = requests.get(url).json()
+
     # ratings has one field ['data'] which contain all reviews
     # ratings has one field ['data'] which contain all reviews
-    data = ratings.get('data')
+    data = response.get('data')
     return data
     return data
 
 
 
 
-def store_reviews_into_db(reviews):
-    pass
+def store_reviews_into_db(page_id):
+    reviews = get_page_reviews(page_id=page_id)
+    for review in reviews:
+        graph_story = review.get('open_graph_story')
+        '''
+        >>> graph_story.keys()
+            dict_keys(['id', 'message', 'start_time', 'type', 'data'])
+        '''
+        review_id = graph_story.get('id')
+        message = graph_story.get('message')
+        start_time = graph_story.get('start_time')
+        recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
+
+        review, created = FacebookReview.objects.update_or_create(
+            id=review_id,
+            recommendation_type=recommendation_type,
+            review_text=message,
+            create_time=start_time,
+            page_id=page_id
+        )
+        if created:
+            print(f'New Facebook review has been created at {page_id}!')
+
+
+def populate_facebook_reviews():
+    page_ids = FacebookPage.objects.values('id')
+    for page_id in page_ids:
+        store_reviews_into_db(page_id=page_id.get('id'))