Przeglądaj źródła

Added review reply functionallity and fixed issues with storing reply

Mohidul Islam 4 lat temu
rodzic
commit
bfcc38a90f

+ 6 - 1
facebook_app/admin.py

@@ -1,5 +1,5 @@
 from django.contrib import admin
-from .models import FacebookPage, FacebookReview
+from .models import FacebookPage, FacebookReview, FacebookReviewReply
 
 
 class FacebookPageAdmin(admin.ModelAdmin):
@@ -16,5 +16,10 @@ class FacebookReviewAdmin(admin.ModelAdmin):
     ordering = ['-create_time']
 
 
+class FacebookReviewReplyAdmin(admin.ModelAdmin):
+    list_display = ('review_id', 'replied_text', 'create_time')
+
+
 admin.site.register(FacebookPage, FacebookPageAdmin)
 admin.site.register(FacebookReview, FacebookReviewAdmin)
+admin.site.register(FacebookReviewReply, FacebookReviewReplyAdmin)

+ 24 - 0
facebook_app/migrations/0003_facebookreviewreply.py

@@ -0,0 +1,24 @@
+# Generated by Django 3.0.4 on 2020-07-29 08:40
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('facebook_app', '0002_facebookpage_location'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='FacebookReviewReply',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('reply_id', models.CharField(max_length=255)),
+                ('replied_text', models.TextField(blank=True, null=True)),
+                ('create_time', models.DateTimeField()),
+                ('review', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='facebook_app.FacebookReview')),
+            ],
+        ),
+    ]

+ 9 - 1
facebook_app/models.py

@@ -21,6 +21,14 @@ class FacebookReview(models.Model):
     page = models.ForeignKey(FacebookPage, on_delete=models.CASCADE)
 
     def __str__(self):
-        return self.review_text
+        return self.review_text if self.review_text else 'No review body...'
 
 
+class FacebookReviewReply(models.Model):
+    reply_id = models.CharField(max_length=255)
+    review = models.OneToOneField(FacebookReview, on_delete=models.CASCADE)
+    replied_text = models.TextField(blank=True, null=True)
+    create_time = models.DateTimeField()
+
+    def __str__(self):
+        return self.replied_text

+ 38 - 1
facebook_app/review_utils.py

@@ -1,5 +1,5 @@
 import requests
-from .models import FacebookPage, FacebookReview
+from .models import FacebookPage, FacebookReview, FacebookReviewReply
 
 BASE_URL = 'https://graph.facebook.com'
 
@@ -17,6 +17,40 @@ def get_page_reviews(page_id):
     return data
 
 
+def store_review_reply(review_id, page_id):
+    token = FacebookPage.objects.get(id=page_id).token
+    url = f'{BASE_URL}/{review_id}/comments?access_token={token}'
+    response = requests.get(url).json()
+    replies = response.get('data')
+
+    # if review has no reply it will return data=[]
+    # if it has reply it it data will return list of reply
+    if not replies:
+        return
+    # we are not interested in all replies.
+    # We need the only reply that we did
+    for reply in replies:
+        from_ = reply.get('from')
+        replier_id = from_.get('id') if from_ else None
+        if replier_id and replier_id == page_id:
+            reply_id = reply.get('id')
+            print(reply_id)
+            create_time = reply.get('created_time')
+            print(create_time)
+            replied_text = reply.get('message')
+            print(replied_text)
+
+            # create the review if not exists else update it
+            rep = FacebookReviewReply.objects.filter(review_id=review_id).first()
+            if not rep:
+                FacebookReviewReply.objects.update_or_create(
+                    review_id=review_id,
+                    reply_id=reply_id,
+                    create_time=create_time,
+                    replied_text=replied_text
+                )
+
+
 def store_reviews_into_db(page_id):
     reviews = get_page_reviews(page_id=page_id)
     for review in reviews:
@@ -40,6 +74,9 @@ def store_reviews_into_db(page_id):
         if created:
             print(f'New Facebook review has been created at {page_id}!')
 
+        # store the review reply that is done by signature care
+        store_review_reply(review_id=review_id, page_id=page_id)
+
 
 def populate_facebook_reviews():
     page_ids = FacebookPage.objects.values('id')