2015-03-26 3 views
2

Я пытаюсь опубликовать веб-сайт Jira в конкретной модели, которую я установил в Django, используя структуру REST. Вот код модели:Что такое идиоматический способ предварительной обработки полезной нагрузки в Django?

class Webhook(models.Model): 
    '''issue object with jia metadata''' 
    event = models.CharField(max_length=256) 
    hook_id = models.IntegerField(max_length=10) 
    self = models.CharField(max_length=1024) 
    issue_key = models.CharField(max_length=12) 
    fields_summary = models.CharField(max_length=1024) 
    user_id = models.CharField(max_length=256) 
    issue_summary = models.CharField(max_length=1024) 
    issuetype_self = models.CharField(max_length=1024) 
    issuetype_id = models.IntegerField(max_length=6) 
    issuetype_name = models.CharField(max_length=48) 
    reporter = models.CharField(max_length=256) 
    updated = models.DateTimeField() 
    created = models.DateTimeField() 
    description = models.CharField(max_length=1024) 
    status_description = models.CharField(max_length=48) 
    status_name = models.CharField(max_length=48) 
    statuscategory_name = models.CharField(max_length=48) 
    project_name = models.CharField(max_length=16) 
    creator = models.CharField(max_length=256) 
    attachment = models.CharField(max_length=1024, blank=True, null=True) 
    thumb = models.CharField(max_length=1024, blank=True, null=True) 

А вот код webhook, который будет вывешен в приложение Django.

{ 
    "webhookEvent": "jira:issue_updated", 
    "user": { 
     "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
     "name": "foo", 
     "emailAddress": "[email protected]_company.com", 
     "avatarUrls": { 
      "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
      "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
      "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
      "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
     }, 
     "displayName": "foo", 
     "active": true 
    }, 
    "issue": { 
     "id": "33062", 
     "self": "https://my.jira-instance.com/rest/api/2/issue/33062", 
     "key": "jira-project-key-355", 
     "fields": { 
      "summary": "The week ahead", 
      "progress": { 
       "progress": 0, 
       "total": 3600, 
       "percent": 0 
      }, 
      "timetracking": { 
       "originalEstimate": "1h", 
       "remainingEstimate": "1h", 
       "originalEstimateSeconds": 3600, 
       "remainingEstimateSeconds": 3600 
      }, 
      "customfield_10081": null, 
      "issuetype": { 
       "self": "https://my.jira-instance.com/rest/api/2/issuetype/6", 
       "id": "6", 
       "description": "", 
       "iconUrl": "https://my.jira-instance.com/images/icons/issuetypes/story.png", 
       "name": "Story", 
       "subtask": false 
      }, 
      "customfield_10080": "11249", 
      "timespent": null, 
      "reporter": { 
       "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
       "name": "foo", 
       "emailAddress": "[email protected]_company.com", 
       "avatarUrls": { 
        "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
        "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
        "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
        "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
       }, 
       "displayName": "foo", 
       "active": true 
      }, 
      "updated": "2015-02-06T06:58:43.374-0800", 
      "customfield_10180": null, 
      "created": "2015-01-02T10:37:27.270-0800", 
      "priority": { 
       "self": "https://my.jira-instance.com/rest/api/2/priority/4", 
       "iconUrl": "https://my.jira-instance.com/images/icons/priorities/minor.png", 
       "name": "Medium", 
       "id": "4" 
      }, 
      "description": null, 
      "customfield_10002": 20.0, 
      "issuelinks": [], 
      "customfield_10004": null, 
      "customfield_10000": null, 
      "customfield_11007": null, 
      "subtasks": [], 
      "status": { 
       "self": "https://my.jira-instance.com/rest/api/2/status/10128", 
       "description": "Staged", 
       "iconUrl": "https://my.jira-instance.com/images/icons/statuses/generic.png", 
       "name": "Staged", 
       "id": "10128", 
       "statusCategory": { 
        "self": "https://my.jira-instance.com/rest/api/2/statuscategory/4", 
        "id": 4, 
        "key": "indeterminate", 
        "colorName": "yellow", 
        "name": "In Progress" 
       } 
      }, 
      "labels": [], 
      "workratio": 0, 
      "project": { 
       "self": "https://my.jira-instance.com/rest/api/2/project/10931", 
       "id": "10931", 
       "key": "jira-project-key", 
       "name": "jira-project-key", 
       "avatarUrls": { 
        "16x16": "https://my.jira-instance.com/secure/projectavatar?size=xsmall&pid=10931&avatarId=11271", 
        "24x24": "https://my.jira-instance.com/secure/projectavatar?size=small&pid=10931&avatarId=11271", 
        "32x32": "https://my.jira-instance.com/secure/projectavatar?size=medium&pid=10931&avatarId=11271", 
        "48x48": "https://my.jira-instance.com/secure/projectavatar?pid=10931&avatarId=11271" 
       }, 
       "projectCategory": { 
        "self": "https://my.jira-instance.com/rest/api/2/projectCategory/10511", 
        "id": "10511", 
        "description": "TV Display Projects", 
        "name": "TV" 
       } 
      }, 
      "aggregateprogress": { 
       "progress": 0, 
       "total": 3600, 
       "percent": 0 
      }, 
      "customfield_11012": null, 
      "lastViewed": "2015-02-06T06:58:43.360-0800", 
      "components": [], 
      "customfield_11010": null, 
      "customfield_10010": null, 
      "comment": { 
       "startAt": 0, 
       "maxResults": 0, 
       "total": 0, 
       "comments": [] 
      }, 
      "timeoriginalestimate": 3600, 
      "customfield_11014": null, 
      "customfield_10681": null, 
      "votes": { 
       "self": "https://my.jira-instance.com/rest/api/2/issue/jira-project-key-355/votes", 
       "votes": 0, 
       "hasVoted": false 
      }, 
      "fixVersions": [], 
      "resolution": null, 
      "resolutiondate": null, 
      "creator": { 
       "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
       "name": "foo", 
       "emailAddress": "[email protected]_company.com", 
       "avatarUrls": { 
        "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
        "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
        "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
        "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
       }, 
       "displayName": "foo", 
       "active": true 
      }, 
      "customfield_10880": null, 
      "aggregatetimeoriginalestimate": 3600, 
      "customfield_10884": null, 
      "customfield_10883": null, 
      "customfield_10881": null, 
      "duedate": null, 
      "customfield_10020": null, 
      "customfield_10782": null, 
      "customfield_10781": "2015-01-30", 
      "customfield_10780": null, 
      "watches": { 
       "self": "https://my.jira-instance.com/rest/api/2/issue/jira-project-key-355/watchers", 
       "watchCount": 1, 
       "isWatching": true 
      }, 
      "worklog": { 
       "startAt": 0, 
       "maxResults": 20, 
       "total": 0, 
       "worklogs": [] 
      }, 
      "assignee": { 
       "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
       "name": "foo", 
       "emailAddress": "[email protected]_company.com", 
       "avatarUrls": { 
        "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
        "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
        "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
        "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
       }, 
       "displayName": "foo", 
       "active": true 
      }, 
      "attachment": [{ 
       "self": "https://my.jira-instance.com/rest/api/2/attachment/13041", 
       "id": "13041", 
       "filename": "jan_5.jpg", 
       "author": { 
        "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
        "name": "foo", 
        "emailAddress": "[email protected]_company.com", 
        "avatarUrls": { 
         "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
         "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
         "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
         "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
        }, 
        "displayName": "foo", 
        "active": true 
       }, 
       "created": "2015-01-02T10:37:37.802-0800", 
       "size": 143252, 
       "mimeType": "image/jpeg", 
       "content": "https://my.jira-instance.com/secure/attachment/13041/jan_5.jpg", 
       "thumbnail": "https://my.jira-instance.com/secure/thumbnail/13041/_thumb_13041.png" 
      }, { 
       "self": "https://my.jira-instance.com/rest/api/2/attachment/13250", 
       "id": "13250", 
       "filename": "ThisWeek_Feb2.jpg", 
       "author": { 
        "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
        "name": "foo", 
        "emailAddress": "[email protected]_company.com", 
        "avatarUrls": { 
         "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
         "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
         "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
         "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
        }, 
        "displayName": "foo", 
        "active": true 
       }, 
       "created": "2015-01-30T10:31:40.641-0800", 
       "size": 274703, 
       "mimeType": "image/jpeg", 
       "content": "https://my.jira-instance.com/secure/attachment/13250/ThisWeek_Feb2.jpg", 
       "thumbnail": "https://my.jira-instance.com/secure/thumbnail/13250/_thumb_13250.png" 
      }, { 
       "self": "https://my.jira-instance.com/rest/api/2/attachment/13087", 
       "id": "13087", 
       "filename": "ThisWeek_jan12.jpg", 
       "author": { 
        "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
        "name": "foo", 
        "emailAddress": "[email protected]_company.com", 
        "avatarUrls": { 
         "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
         "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
         "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
         "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
        }, 
        "displayName": "foo", 
        "active": true 
       }, 
       "created": "2015-01-12T08:18:40.652-0800", 
       "size": 121908, 
       "mimeType": "image/jpeg", 
       "content": "https://my.jira-instance.com/secure/attachment/13087/ThisWeek_jan12.jpg", 
       "thumbnail": "https://my.jira-instance.com/secure/thumbnail/13087/_thumb_13087.png" 
      }, { 
       "self": "https://my.jira-instance.com/rest/api/2/attachment/13147", 
       "id": "13147", 
       "filename": "ThisWeek_jan19.png", 
       "author": { 
        "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
        "name": "foo", 
        "emailAddress": "[email protected]_company.com", 
        "avatarUrls": { 
         "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
         "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
         "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
         "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
        }, 
        "displayName": "foo", 
        "active": true 
       }, 
       "created": "2015-01-19T09:40:58.930-0800", 
       "size": 2339087, 
       "mimeType": "image/png", 
       "content": "https://my.jira-instance.com/secure/attachment/13147/ThisWeek_jan19.png", 
       "thumbnail": "https://my.jira-instance.com/secure/thumbnail/13147/_thumb_13147.png" 
      }, { 
       "self": "https://my.jira-instance.com/rest/api/2/attachment/13189", 
       "id": "13189", 
       "filename": "ThisWeek-Jan26.jpg", 
       "author": { 
        "self": "https://my.jira-instance.com/rest/api/2/user?username=foo", 
        "name": "foo", 
        "emailAddress": "[email protected]_company.com", 
        "avatarUrls": { 
         "16x16": "https://my.jira-instance.com/secure/useravatar?size=xsmall&ownerId=foo&avatarId=11062", 
         "24x24": "https://my.jira-instance.com/secure/useravatar?size=small&ownerId=foo&avatarId=11062", 
         "32x32": "https://my.jira-instance.com/secure/useravatar?size=medium&ownerId=foo&avatarId=11062", 
         "48x48": "https://my.jira-instance.com/secure/useravatar?ownerId=foo&avatarId=11062" 
        }, 
        "displayName": "foo", 
        "active": true 
       }, 
       "created": "2015-01-23T09:55:32.198-0800", 
       "size": 138201, 
       "mimeType": "image/jpeg", 
       "content": "https://my.jira-instance.com/secure/attachment/13189/ThisWeek-Jan26.jpg", 
       "thumbnail": "https://my.jira-instance.com/secure/thumbnail/13189/_thumb_13189.png" 
      }], 
      "aggregatetimeestimate": 3600, 
      "versions": [], 
      "timeestimate": 3600, 
      "aggregatetimespent": null, 
      "customfield_10070": null 
     } 
    }, 
    "changelog": { 
     "id": "219580", 
     "items": [{ 
      "field": "status", 
      "fieldtype": "jira", 
      "from": "10127", 
      "fromString": "Submitted", 
      "to": "10128", 
      "toString": "Staged" 
     }] 
    }, 
    "timestamp": 1423234723378 
} 

Мой вопрос: какой предпочтительный метод обработки данных в полезной нагрузке POST подходит для моей модели? Должен ли я реорганизовать мою модель для соответствия веб-ходу JSON? Или я должен использовать крюк предварительного сохранения для анализа моих желаемых атрибутов, а затем вернуть эту обработанную полезную нагрузку? Или я должен перезаписать метод сохранения в объекте webhook для анализа данных, которые мне нужны, а затем сохранить только нужные биты?

Я попытался создать простой сериализатор, инициализируя несколько полей и бросая всю полезную нагрузку на него, чтобы увидеть, какие палки, но ничего не сохраняется.

+0

Как человек, который никогда не имел дело с веб-крючками JIRA, было бы полезно, если бы вы упомянули, как поля модели отображают поля полезной нагрузки. –

+0

Было бы более разумным, если бы я изменил атрибуты модели, чтобы соответствовать экземпляру webhook в моем сообщении? – user352472

ответ

2

Это действительно зависит от того, что вы пытаетесь сделать с собранными данными. Создание класса сопоставления будет лучшим решением, если оно предназначено только для хранения данных.

class JiraWebhookMapper(object): 
    def map(data): 
     return {'user_id': data.get("user").get("id") ....} 


mapped_data = JiraWebhookMapper().map(response.content) 
WebHook.objects.create(**mapped_data) 
+0

А, это имеет смысл. Не могли бы вы расширить свой ответ, я не уверен, как его реализовать. Например, где я могу добавить этот код? В разделе модели и переопределите метод create? Или добавить это как предварительный кэш и вернуть отображаемые данные в метод сохранения? – user352472

+1

Я бы создал класс mapper в файле mapper.py. Затем в вашем view.py вы можете вызвать эту оболочку и создать объект webhook. – harshil

Смежные вопросы