コード例 #1
0
    def test_constructor(self):
        storage = Storage(FakeCredentialsModel, self.key_name, self.key_value,
                          self.property_name)

        self.assertEqual(storage.model_class, FakeCredentialsModel)
        self.assertEqual(storage.key_name, self.key_name)
        self.assertEqual(storage.key_value, self.key_value)
        self.assertEqual(storage.property_name, self.property_name)
コード例 #2
0
 def test_locked_put(self, djangoModel):
     entity_mock = mock.Mock(credentials=None)
     objects = mock.Mock(get_or_create=mock.Mock(return_value=(entity_mock,
                                                               None)))
     FakeCredentialsModelMock.objects = objects
     storage = Storage(FakeCredentialsModelMock, self.key_name,
                       self.key_value, self.property_name)
     storage.locked_put(self.credentials)
コード例 #3
0
def oauth2redirect(request):
    global flow
    # It is called after user allows the calender permission
    # stores the credentials and redirects to next
    credential = flow.step2_exchange(request.GET['code'])
    storage = Storage(SiteUser, 'user', request.user, 'credential')
    storage.put(credential)
    return HttpResponseRedirect(request.session.pop('redirect_url'))
コード例 #4
0
ファイル: views.py プロジェクト: hnjamba/onaclone-2018
def _get_google_credential(request):
    token = None
    if request.user.is_authenticated():
        storage = Storage(TokenStorageModel, 'id', request.user, 'credential')
        credential = storage.get()
    elif request.session.get('access_token'):
        credential = google_client.OAuth2Credentials.from_json(token)

    return credential or HttpResponseRedirect(
        google_flow.step1_get_authorize_url())
コード例 #5
0
    def test_locked_get_no_entities(self, djangoModel):
        entities = []
        filter_mock = mock.Mock(return_value=entities)
        object_mock = mock.Mock()
        object_mock.filter = filter_mock
        FakeCredentialsModelMock.objects = object_mock

        storage = Storage(FakeCredentialsModelMock, self.key_name,
                          self.key_value, self.property_name)
        credential = storage.locked_get()
        self.assertIsNone(credential)
コード例 #6
0
    def test_locked_get_no_set_store(self, djangoModel):
        fake_model_with_credentials = FakeCredentialsModelMockNoSet()
        entities = [fake_model_with_credentials]
        filter_mock = mock.Mock(return_value=entities)
        object_mock = mock.Mock()
        object_mock.filter = filter_mock
        FakeCredentialsModelMockNoSet.objects = object_mock

        storage = Storage(FakeCredentialsModelMockNoSet, self.key_name,
                          self.key_value, self.property_name)
        credential = storage.locked_get()
        self.assertEqual(credential, fake_model_with_credentials.credentials)
コード例 #7
0
def add_to_google_calender(request):
    site_user = SiteUser.objects.get(user=request.user)

    # Get Credentials
    storage = Storage(SiteUser, 'user', request.user, 'credential')
    credential = storage.get()

    # Validate them if invalid then authorize the request again
    if credential is None or credential.invalid:
        auth_uri = flow.step1_get_authorize_url()
        request.session['redirect_url'] = '/add-to-calendar'
        return HttpResponseRedirect(auth_uri)

    # Get the service
    http = httplib2.Http()
    http_authorized = credential.authorize(http)
    service = build("calendar", "v3", http=http_authorized)
    schedule = Schedule.objects.get(sch_id=request.session.pop('sch_id'))

    # Event to be added
    event = {
        'summary':
        'Demo Scheduled for Scribe',
        'location':
        'Skype',
        'description':
        'To get to know about the service and products of Scribe.',
        'start': {
            'dateTime': schedule.schedule_date_time.isoformat(),
        },
        'end': {
            'dateTime': (schedule.schedule_date_time +
                         datetime.timedelta(minutes=30)).isoformat(),
        },
        'attendees': [
            {
                'email': schedule.customer.user.email
            },
            {
                'email': schedule.salesman.user.email
            },
        ],
    }

    # Insert the Event
    event = service.events().insert(calendarId='primary', body=event).execute()
    schedule.event_link = event.get('htmlLink')

    # Redirect to homepage
    return HttpResponseRedirect('/home')
コード例 #8
0
def notifications(request):
    # channel id to find for which salesman it is
    channel_id = request.META['HTTP_X_GOOG_CHANNEL_ID']
    try:
        site_user = SiteUser.objects.get(notification_channel_id=channel_id)
    except SiteUser.DoesNotExist:
        # As I was trying accounts again and again so I created some channels on which no user is attached
        # but google is sending data so ignoring that
        return HttpResponse(status=200)

    # get credential
    storage = Storage(SiteUser, 'user', site_user.user, 'credential')
    credential = storage.get()

    # Get the service
    http = httplib2.Http()
    http_authorized = credential.authorize(http)
    service = build("calendar", "v3", http=http_authorized)
    next_page_token = None

    # Get the events of calendar
    while True:
        event_request = service.events().list(calendarId='primary',
                                              singleEvents=True,
                                              orderBy='startTime',
                                              maxResults=10,
                                              pageToken=next_page_token)
        event_results = event_request.execute()
        events = event_results.get('items', [])
        for event in events:
            # Add to database if not exist
            try:
                event_model = EventFromOtherSources.objects.get(
                    event_id=event['id'])
            except EventFromOtherSources.DoesNotExist:
                start_time = parse(event['start']['dateTime'])
                end_time = parse(event['end']['dateTime'])
                event_model = EventFromOtherSources.objects.create(
                    event_id=event['id'],
                    salesman=site_user,
                    start_time=start_time - start_time.utcoffset(),
                    end_time=end_time - end_time.utcoffset())
        next_page_token = event_results.get('nextPageToken')

        # break when data finishes
        if next_page_token is None:
            break

    return HttpResponse(status=200)
コード例 #9
0
    def test_locked_delete(self, djangoModel):
        class FakeEntities(object):
            def __init__(self):
                self.deleted = False

            def delete(self):
                self.deleted = True

        fake_entities = FakeEntities()
        entities = fake_entities

        filter_mock = mock.Mock(return_value=entities)
        object_mock = mock.Mock()
        object_mock.filter = filter_mock
        FakeCredentialsModelMock.objects = object_mock
        storage = Storage(FakeCredentialsModelMock, self.key_name,
                          self.key_value, self.property_name)
        storage.locked_delete()
        self.assertTrue(fake_entities.deleted)
コード例 #10
0
ファイル: views.py プロジェクト: FadedCoder/PlayMusicManager
def registration(request):
    form = SignUpForm()
    flow = OAuth2WebServerFlow(*musicmanager.oauth)
    auth_uri = flow.step1_get_authorize_url()
    args = {'form': form, 'auth_uri': auth_uri}
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            credential = flow.step2_exchange(
                form.cleaned_data.get('oauth_code'))
            user = form.save()
            user.refresh_from_db()
            storage = Storage(Profile, 'user', user, 'google_oauth')
            storage.put(credential)
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            login(request, user)
            return redirect('index')
        args.update({'form': form})
    return render(request, 'core/register.html', args)
コード例 #11
0
ファイル: api_export_tools.py プロジェクト: zerxis/onadata
def _get_google_credential(request):
    token = None
    credential = None
    if request.user.is_authenticated:
        storage = Storage(TokenStorageModel, 'id', request.user, 'credential')
        credential = storage.get()
    elif request.session.get('access_token'):
        credential = google_client.OAuth2Credentials.from_json(token)

    if credential:
        try:
            credential.get_access_token()
        except HttpAccessTokenRefreshError:
            try:
                credential.revoke(httplib2.Http())
            except TokenRevokeError:
                storage.delete()

    if not credential or credential.invalid:
        google_flow = generate_google_web_flow(request)
        return HttpResponseRedirect(google_flow.step1_get_authorize_url())
    return credential
コード例 #12
0
def get_calendar_permission(request):
    # This method gets the calendar access permission as soon as user log in
    site_user = SiteUser.objects.get(user=request.user)
    storage = Storage(SiteUser, 'user', request.user, 'credential')
    credential = storage.get()
    if credential is None or credential.invalid \
            or credential.id_token['email'] != site_user.user.email:
        auth_uri = flow.step1_get_authorize_url()
        request.session['redirect_url'] = '/get-calendar-permission'
        return HttpResponseRedirect(auth_uri)

    if site_user.is_salesman and not site_user.notification_enabled:
        # if user is sales man then get all data from calendar and enable the push notifications
        # Get the service
        http = httplib2.Http()
        http_authorized = credential.authorize(http)
        service = build("calendar", "v3", http=http_authorized)
        next_page_token = None
        while True:
            event_request = service.events().list(calendarId='primary',
                                                  singleEvents=True,
                                                  orderBy='startTime',
                                                  maxResults=10,
                                                  pageToken=next_page_token)
            event_results = event_request.execute()
            events = event_results.get('items', [])
            for event in events:
                try:
                    event_model = EventFromOtherSources.objects.get(
                        event_id=event['id'])
                except EventFromOtherSources.DoesNotExist:
                    start_time = parse(event['start']['dateTime'])
                    end_time = parse(event['end']['dateTime'])
                    event_model = EventFromOtherSources.objects.create(
                        event_id=event['id'],
                        salesman=site_user,
                        start_time=start_time - start_time.utcoffset(),
                        end_time=end_time - end_time.utcoffset())
            next_page_token = event_results.get('nextPageToken')

            if next_page_token is None:
                break

        # Enable the push notifications
        email = site_user.user.email
        url = 'https://www.googleapis.com/calendar/v3/calendars/{email}/events/watch'.format(
            email=email)

        headers = {
            'Content-Type': 'application/json',
            'Authorization':
            'Bearer ' + credential.get_access_token().access_token
        }
        data = {
            'id':
            'notification-channel-id-for-' +
            email[:email.index('@')].replace('.', '-'),
            "type":
            "web_hook",
            "address":
            "https://cdf1fd5c.ngrok.io/notifications"
        }
        res = requests.post(url, data=json.dumps(data), headers=headers)

        # save channel id
        site_user.notification_channel_id = data['id']
        site_user.notification_enabled = True
        site_user.save()

    return HttpResponseRedirect('/home')