Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

# -*- coding: utf-8 -*- 

""" 

Base classes for webhook events 

""" 

 

import logging 

import datetime 

 

 

LOGGER = logging.getLogger(__name__) 

 

 

class BaseWebhookEvent(object): 

    """ 

    Interface shared by all webhook events 

    """ 

 

    RESERVED_NAMES = {'event', 'email', 'timestamp', 'ip', 'tls', 'cert_error', 

                      'smtp-id', 'useragent', 'category', 'reason', 'type', 

                      'status', 'url', 'asm_group_id'} 

 

    def __init__(self, request, data): 

        LOGGER.debug("Received data %r", data) 

        self.request = request 

        self.data = dict(data) 

        self.event = self.data['event'] 

        self.email = self.data['email'] 

        self.timestamp = self.data['timestamp'] 

        self.ip = self.data['ip'] 

        self.tls = self.data['tls'] 

        self.cert_error = self.data['tls'] 

 

        self.category = self.data['category'] 

 

        self.unique_arguments = self.extract_unique_params(self.data) 

 

    @classmethod 

    def extract_unique_params(cls, data): 

        """ 

        Returns a dictionary of all unique arguments provided 

 

        Unique arguments are considered to be any provided arguments that 

        aren't known Sendgrid names 

        """ 

        return {k: v for k, v in data.iteritems() 

                if k not in cls.RESERVED_NAMES} 

 

    @property 

    def dt(self): 

        """ Naive UTC datetime corresponding to this event's timestamp """ 

        return datetime.datetime.utcfromtimestamp(self.timestamp) 

 

    @property 

    def categories(self): 

        """ Returns categories as a list """ 

        if not self.category: 

            return [] 

        elif isinstance(self.category, basestring): 

            return [self.category] 

        else: 

            return list(self.category) 

 

 

__all__ = ['BaseWebhookEvent']