7 |
33 |
34 | {% if link %}
35 |
36 | Access Link:
37 |
38 | {{ link }}
39 |
40 |
41 | {% endif %}
42 |
43 | {% endblock %}
--------------------------------------------------------------------------------
/django_bigbluebutton/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | from .models import Meeting
4 | from .bbb import BigBlueButton
5 | from .utils import xml_to_json
6 |
7 |
8 | class BBBTest(TestCase):
9 |
10 | def test_get_meetings(self):
11 | """ Test if BigBlueButton's get_meeting method is working or not.
12 | It should return list of all running meetings right now!. """
13 | meetings = BigBlueButton().get_meetings()
14 | print(meetings)
15 |
16 | # If error in getMeetings() will return 'error' value instead of list of meeting rooms
17 | self.assertTrue(meetings != 'error')
18 |
19 | self.assertTrue(type(meetings) == list)
20 |
21 | def test_create_meeting(self):
22 | """ Will try to create a meeting with bbb.
23 |
24 | Example output as json from bbb 'create' command:
25 |
26 | {'returncode': 'SUCCESS', 'meetingID': 'test',
27 | 'internalMeetingID': 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3-1598891360456',
28 | 'parentMeetingID': 'bbb-none', 'attendeePW': 'ap', 'moderatorPW': 'mp',
29 | 'createTime': '1598891360456', 'voiceBridge': '73362', 'dialNumber': '613-555-1234',
30 | 'createDate': 'Mon Aug 31 12:29:20 EDT 2020', 'hasUserJoined': 'false',
31 | 'duration': '0', 'hasBeenForciblyEnded': 'false', 'messageKey': None, 'message': None}
32 | """
33 | meeting_name = 'test'
34 | meeting_id = 'test'
35 | meeting_welcome = 'test meeting welcome!'
36 |
37 | # First step is to request BBB and create a meeting
38 | m_xml = BigBlueButton().start(
39 | name=meeting_name,
40 | meeting_id=meeting_id,
41 | welcome=meeting_welcome
42 | )
43 | meeting_json = xml_to_json(m_xml)
44 | self.assertTrue(meeting_json['returncode'] == 'SUCCESS')
45 | self.assertTrue(meeting_json['meetingID'] == meeting_id)
46 |
47 | # Now create a model for it.
48 | current_meetings = Meeting.objects.count()
49 | meeting, _ = Meeting.objects.get_or_create(meeting_id=meeting_json['meetingID'])
50 | meeting.meeting_id = meeting_json['meetingID']
51 | meeting.name = meeting_name
52 | meeting.welcome_text = meeting_json['meetingID']
53 | meeting.attendee_password = meeting_json['attendeePW']
54 | meeting.moderator_password = meeting_json['moderatorPW']
55 | meeting.internal_meeting_id = meeting_json['internalMeetingID']
56 | meeting.parent_meeting_id = meeting_json['parentMeetingID']
57 | meeting.voice_bridge = meeting_json['voiceBridge']
58 | meeting.save()
59 |
60 | self.assertFalse(Meeting.objects.count() == current_meetings)
61 |
62 | def test_create_meeting2(self):
63 | """ Will just call cls method in Meeting model. """
64 | meeting_name = 'test2'
65 | meeting_id = 'test2'
66 | meeting_welcome = 'test meeting welcome!'
67 | m = Meeting.create(meeting_name, meeting_id, meeting_welcome=meeting_welcome)
68 | self.assertTrue(type(m) == Meeting)
69 |
70 | def test_create_and_join_meeting(self):
71 | """ Will just call cls method in Meeting model. """
72 | meeting_name = 'test'
73 | meeting_id = 'testtttt'
74 | meeting_welcome = 'test meeting welcome!'
75 | meeting = Meeting.create(meeting_name, meeting_id, meeting_welcome=meeting_welcome)
76 |
77 | b = BigBlueButton().join_url(meeting.meeting_id, 'Moderator of Class', meeting.moderator_password)
78 | print('As moderator: {}'.format(b))
79 | # It will print a link. join with it and see if it's ok or not!
80 |
81 | b = BigBlueButton().join_url(meeting.meeting_id, 'reza torkaman ahmadi', meeting.attendee_password)
82 | print('As attendee: {}'.format(b))
83 |
84 | def test_join_existing_meeting(self):
85 | meeting_id = 'ranxbqe6jfh1g53ymcnfr2p8elhcduoxsklwb2kr'
86 | b = BigBlueButton().join_url(meeting_id, 'Test User', 'dYHwpBBjlZoI')
87 | print(b)
88 |
89 | def test_end_meeting(self):
90 | meeting_name = 'test'
91 | meeting_id = 'test'
92 | meeting_welcome = 'test meeting welcome!'
93 | meeting = Meeting.create(meeting_name, meeting_id, meeting_welcome=meeting_welcome)
94 |
95 | status = BigBlueButton().end_meeting('test', meeting.moderator_password)
96 | print(status)
97 |
98 | def test_hook_create(self):
99 | meeting_id = 'testmeeting-11'
100 | Meeting.create('test meeting', meeting_id, meeting_welcome='welcome')
101 | result = BigBlueButton().create_hook('https://webhook.site/7897a4f6-9388-4335-8055-d4550ba39fea', meeting_id)
102 | self.assertTrue(result)
103 |
104 | def test_hook_delete(self):
105 | meeting_id = 'testmeeting-11'
106 |
107 | # First create a meeting
108 | Meeting.create('test meeting', meeting_id, meeting_welcome='welcome')
109 |
110 | # Now create a hook for it
111 | res = BigBlueButton().create_hook('https://webhook.site/7897a4f6-9388-4335-8055-d4550ba39fea', meeting_id)
112 | hook_id = res['hook_id']
113 |
114 | # Now try to remove that hook
115 | status = BigBlueButton().destroy_hook(hook_id)
116 | self.assertTrue(status)
117 |
118 | def test_hook_list(self):
119 | meeting_id = 'testmeeting-11'
120 | result = BigBlueButton().get_hooks()
121 | len1 = len(result)
122 |
123 | # Now create a new hook
124 | Meeting.create('test meeting', meeting_id, meeting_welcome='welcome')
125 | BigBlueButton().create_hook('https://webhook.site/7897a4f6-9388-4335-8055-d4550ba39fea', meeting_id)
126 |
127 | # Now check new list of hooks see if it is increased
128 | result = BigBlueButton().get_hooks()
129 | len2 = len(result)
130 |
131 | self.assertTrue(len1 != len2)
132 | self.assertTrue(len2 - len1 == 1)
133 |
134 | def test_callback_api(self):
135 | data = '''
136 | [{
137 | "data":{
138 | "type":"event",
139 | "id":"user-joined",
140 | "attributes":{
141 | "meeting":{
142 | "internal-meeting-id":"914732701ca2fba8097f125f20eff107203b303e-1624350420282",
143 | "external-meeting-id":"meeting-id"
144 | },
145 | "user":{
146 | "internal-user-id":"w_eunlmvgzcnlz",
147 | "external-user-id":"161",
148 | "name":"test user",
149 | "role":"VIEWER",
150 | "presenter":False
151 | }
152 | },
153 | "event":{
154 | "ts":1624364288797
155 | }
156 | }
157 | }]
158 | '''
159 | url = 'api/meeting/66/callback/'
160 | res = self.client.post(url, data, content_type='application/json')
161 | print(res.status_code)
162 | print(res.content)
163 |
164 |
--------------------------------------------------------------------------------
/django_bigbluebutton/urls.py:
--------------------------------------------------------------------------------
1 | from django.urls import path, include
2 |
3 | urlpatterns = [
4 | path("api/", include(("django_bigbluebutton.api.urls", "django_bigbluebutton.api.urls"), "api_bbb"), ),
5 | ]
6 |
--------------------------------------------------------------------------------
/django_bigbluebutton/utils.py:
--------------------------------------------------------------------------------
1 | import xml.etree.ElementTree as ET
2 |
3 |
4 | def parse_xml(response):
5 | try:
6 | xml = ET.XML(response)
7 | code = xml.find('returncode').text
8 | if code == 'SUCCESS':
9 | return xml
10 | else:
11 | raise
12 | except:
13 | return None
14 |
15 |
16 | def xml_to_json(xml):
17 | result = {}
18 | for x in xml:
19 | result[x.tag] = x.text
20 | return result
21 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | import os
2 | from setuptools import setup
3 |
4 | here = os.path.abspath(os.path.dirname(__file__))
5 | README = open(os.path.join(here, 'README.md')).read()
6 |
7 | setup(
8 | name='django-bigbluebutton',
9 | version='0.5.9',
10 | packages=['django_bigbluebutton'],
11 | description='A Django APP to Integrate BigBlueButton APIs with your current Project',
12 | long_description=README,
13 | long_description_content_type='text/markdown',
14 | author='Execut3',
15 | author_email='execut3.binarycodes@gmail.com',
16 | url='https://github.com/Execut3/django-bigbluebutton',
17 | license='GPT',
18 | install_requires=[
19 | 'Django>=2.0',
20 | 'requests>=2.0',
21 | 'djangorestframework>=3.0.0'
22 | ],
23 | include_package_data=True,
24 | )
25 |
--------------------------------------------------------------------------------