mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 14:03:30 +00:00 
			
		
		
		
	integrations: Add webhook code, API endpoint, and tests for GoSquared.
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								static/images/integrations/logos/gosquared.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/images/integrations/logos/gosquared.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 10 KiB  | 
							
								
								
									
										182
									
								
								zerver/fixtures/gosquared/gosquared_traffic_spike.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								zerver/fixtures/gosquared/gosquared_traffic_spike.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,182 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
						"triggeredAlert": {
 | 
				
			||||||
 | 
							"id": 28632,
 | 
				
			||||||
 | 
							"boundary": "lower",
 | 
				
			||||||
 | 
							"value": "3",
 | 
				
			||||||
 | 
							"type": "concurrents"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"siteDetails": {
 | 
				
			||||||
 | 
							"user_id": 81923,
 | 
				
			||||||
 | 
							"acct": "GSN-595854-T",
 | 
				
			||||||
 | 
							"email": "asdasd@fasdf.com",
 | 
				
			||||||
 | 
							"first_name": "sadasd",
 | 
				
			||||||
 | 
							"last_name": "",
 | 
				
			||||||
 | 
							"site_name": "http://requestb.in/",
 | 
				
			||||||
 | 
							"domain": "requestb.in",
 | 
				
			||||||
 | 
							"url": "http://requestb.in/",
 | 
				
			||||||
 | 
							"timezone": "Australia/Sydney"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"snapshot": {
 | 
				
			||||||
 | 
							"time": {
 | 
				
			||||||
 | 
								"time": 1481952442380,
 | 
				
			||||||
 | 
								"local": "2016-12-17T16:27:22+11:00"
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"concurrents": {
 | 
				
			||||||
 | 
								"visitors": 0,
 | 
				
			||||||
 | 
								"returning": 0,
 | 
				
			||||||
 | 
								"pages": 0,
 | 
				
			||||||
 | 
								"active": 0,
 | 
				
			||||||
 | 
								"tagged": 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"timeSeries": {
 | 
				
			||||||
 | 
								"visitors.total": [{
 | 
				
			||||||
 | 
									"time": "2016-12-17T15:57:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T15:58:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T15:59:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:00:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:01:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:02:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:03:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:04:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:05:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:06:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:07:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:08:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:09:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:10:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:11:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:12:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:13:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:14:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:15:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:16:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:17:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:18:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:19:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:20:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:21:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:22:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:23:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:24:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:25:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:26:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}, {
 | 
				
			||||||
 | 
									"time": "2016-12-17T16:27:22+11:00",
 | 
				
			||||||
 | 
									"value": 0
 | 
				
			||||||
 | 
								}]
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"pages": {
 | 
				
			||||||
 | 
								"list": [],
 | 
				
			||||||
 | 
								"cardinality": 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"sources": {
 | 
				
			||||||
 | 
								"direct": 0,
 | 
				
			||||||
 | 
								"site": {
 | 
				
			||||||
 | 
									"list": [],
 | 
				
			||||||
 | 
									"visitors": 0,
 | 
				
			||||||
 | 
									"cardinality": 0
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"social": {
 | 
				
			||||||
 | 
									"list": [],
 | 
				
			||||||
 | 
									"visitors": 0,
 | 
				
			||||||
 | 
									"cardinality": 0
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"organic": {
 | 
				
			||||||
 | 
									"list": [],
 | 
				
			||||||
 | 
									"visitors": 0,
 | 
				
			||||||
 | 
									"cardinality": 0
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"internal": {
 | 
				
			||||||
 | 
									"list": [],
 | 
				
			||||||
 | 
									"visitors": 0,
 | 
				
			||||||
 | 
									"cardinality": 0
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"engagement": {
 | 
				
			||||||
 | 
								"timeOnSite": {
 | 
				
			||||||
 | 
									"breakdown": {
 | 
				
			||||||
 | 
										"0": 0,
 | 
				
			||||||
 | 
										"10": 0,
 | 
				
			||||||
 | 
										"30": 0,
 | 
				
			||||||
 | 
										"60": 0,
 | 
				
			||||||
 | 
										"300": 0,
 | 
				
			||||||
 | 
										"900": 0,
 | 
				
			||||||
 | 
										"1800": 0
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"average": 0
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"visitDepth": {
 | 
				
			||||||
 | 
									"breakdown": {
 | 
				
			||||||
 | 
										"1": 0,
 | 
				
			||||||
 | 
										"2": 0,
 | 
				
			||||||
 | 
										"5": 0,
 | 
				
			||||||
 | 
										"15": 0,
 | 
				
			||||||
 | 
										"30": 0,
 | 
				
			||||||
 | 
										"60": 0
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
									"detailedBreakdown": {},
 | 
				
			||||||
 | 
									"average": 0
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"concurrents": 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -125,6 +125,7 @@ WEBHOOK_INTEGRATIONS = [
 | 
				
			|||||||
        function='zerver.views.webhooks.github_webhook.api_github_webhook'
 | 
					        function='zerver.views.webhooks.github_webhook.api_github_webhook'
 | 
				
			||||||
    ),
 | 
					    ),
 | 
				
			||||||
    WebhookIntegration('gitlab', display_name='GitLab'),
 | 
					    WebhookIntegration('gitlab', display_name='GitLab'),
 | 
				
			||||||
 | 
					    WebhookIntegration('gosquared', display_name='GoSquared'),
 | 
				
			||||||
    WebhookIntegration('helloworld', display_name='Hello World'),
 | 
					    WebhookIntegration('helloworld', display_name='Hello World'),
 | 
				
			||||||
    WebhookIntegration('heroku', display_name='Heroku'),
 | 
					    WebhookIntegration('heroku', display_name='Heroku'),
 | 
				
			||||||
    WebhookIntegration('ifttt', function='zerver.views.webhooks.ifttt.api_iftt_app_webhook', display_name='IFTTT'),
 | 
					    WebhookIntegration('ifttt', function='zerver.views.webhooks.ifttt.api_iftt_app_webhook', display_name='IFTTT'),
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								zerver/tests/webhooks/test_gosquared.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								zerver/tests/webhooks/test_gosquared.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
 | 
					from zerver.lib.test_classes import WebhookTestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GoSquaredHookTests(WebhookTestCase):
 | 
				
			||||||
 | 
					    STREAM_NAME = 'gosquared'
 | 
				
			||||||
 | 
					    URL_TEMPLATE = "/api/v1/external/gosquared?stream={stream}&api_key={api_key}"
 | 
				
			||||||
 | 
					    FIXTURE_DIR_NAME = 'gosquared'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Note: Include a test function per each distinct message condition your integration supports
 | 
				
			||||||
 | 
					    def test_traffic_message(self):
 | 
				
			||||||
 | 
					        # type: () -> None
 | 
				
			||||||
 | 
					        expected_subject = u"GoSquared"
 | 
				
			||||||
 | 
					        expected_message = u"requestb.in has 0 visitors online."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # use fixture named helloworld_hello
 | 
				
			||||||
 | 
					        self.send_and_test_stream_message('traffic_spike', expected_subject, expected_message,
 | 
				
			||||||
 | 
					                                          content_type="application/x-www-form-urlencoded")
 | 
				
			||||||
							
								
								
									
										29
									
								
								zerver/views/webhooks/gosquared.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								zerver/views/webhooks/gosquared.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					from __future__ import absolute_import
 | 
				
			||||||
 | 
					from django.utils.translation import ugettext as _
 | 
				
			||||||
 | 
					from zerver.lib.actions import check_send_message
 | 
				
			||||||
 | 
					from zerver.lib.response import json_success, json_error
 | 
				
			||||||
 | 
					from zerver.decorator import REQ, has_request_variables, api_key_only_webhook_view
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from zerver.models import Client, UserProfile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.http import HttpRequest, HttpResponse
 | 
				
			||||||
 | 
					from typing import Dict, Any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BODY_TEMPLATE = '{website_name} has {user_num} visitors online.'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@api_key_only_webhook_view('GoSquared')
 | 
				
			||||||
 | 
					@has_request_variables
 | 
				
			||||||
 | 
					def api_gosquared_webhook(request, user_profile, client,
 | 
				
			||||||
 | 
					                          payload=REQ(argument_type='body'),
 | 
				
			||||||
 | 
					                          stream=REQ(default='gosquared'),
 | 
				
			||||||
 | 
					                          topic=REQ(default='GoSquared')):
 | 
				
			||||||
 | 
					    # type: (HttpRequest, UserProfile, Client, Dict[str, Dict[str, Any]]) -> HttpResponse
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        domain_name = payload['siteDetails']['domain']
 | 
				
			||||||
 | 
					        user_num = payload['concurrents']
 | 
				
			||||||
 | 
					        body = BODY_TEMPLATE.format(website_name=domain_name, user_num=user_num)
 | 
				
			||||||
 | 
					    except KeyError as e:
 | 
				
			||||||
 | 
					        return json_error(_("Missing key {} in JSON").format(str(e)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    check_send_message(user_profile, client, 'stream', [stream], topic, body)
 | 
				
			||||||
 | 
					    return json_success()
 | 
				
			||||||
		Reference in New Issue
	
	Block a user