def assert_subject_loaded(self, data): slug = data['field_subject_url_slug'] subject = Subject.objects.get(slug=slug, partner=self.partner) expected_values = { 'uuid': UUID(data['uuid']), 'name': data['title'], 'description': clean_html(data['body']['value']), 'subtitle': clean_html(data['field_subject_subtitle']['value']), 'card_image_url': data['field_subject_card_image']['url'], 'banner_image_url': data['field_xseries_banner_image']['url'], } for field, value in expected_values.items(): self.assertEqual(getattr(subject, field), value)
def process_node(self, data): slug = data['field_subject_url_slug'] if ('language' not in data) or (data['language'] == 'und'): language_code = 'en' else: language_code = data['language'] defaults = { 'uuid': data['uuid'], 'name': data['title'], 'description': clean_html(data['body']['value']), 'subtitle': clean_html(data['field_subject_subtitle']['value']), 'card_image_url': self._get_nested_url(data.get('field_subject_card_image')), # NOTE (CCB): This is not a typo. Yes, the banner image for subjects is in a field with xseries in the name. 'banner_image_url': self._get_nested_url(data.get('field_xseries_banner_image')) } # There is a bug with django-parler when using django's update_or_create() so we manually update or create. try: subject = Subject.objects.get(slug=slug, partner=self.partner) subject.set_current_language(language_code) for key, value in defaults.items(): setattr(subject, key, value) subject.save() except Subject.DoesNotExist: new_values = { 'slug': slug, 'partner': self.partner, '_current_language': language_code } new_values.update(defaults) subject = Subject(**new_values) subject.save() logger.info('Processed subject with slug [%s].', slug) return subject
def test_ingest_update(self): self.mock_login_response() api_data = self.mock_api() for data in api_data: subject_data = { 'uuid': UUID(data['uuid']), 'name': data['title'], 'description': clean_html(data['body']['value']), 'subtitle': clean_html(data['field_subject_subtitle']['value']), 'card_image_url': data['field_subject_card_image']['url'], 'banner_image_url': data['field_xseries_banner_image']['url'], } slug = data['field_subject_url_slug'] Subject.objects.create(slug=slug, partner=self.partner, **subject_data) self.loader.ingest() for datum in api_data: self.assert_subject_loaded(datum)
def process_node(self, data): uuid = data['uuid'] body = (data['body'] or {}).get('value') if body: body = clean_html(body) defaults = { 'key': data['url'].split('/')[-1], 'name': data['title'], 'description': body, 'logo_image_url': data['field_sponsorer_image']['url'], } sponsor, __ = Organization.objects.update_or_create( uuid=uuid, partner=self.partner, defaults=defaults) logger.info('Processed sponsor with UUID [%s].', uuid) return sponsor
def assert_sponsor_loaded(self, data): uuid = data['uuid'] school = Organization.objects.get(uuid=uuid, partner=self.partner) body = (data['body'] or {}).get('value') if body: body = clean_html(body) expected_values = { 'key': data['url'].split('/')[-1], 'name': data['title'], 'description': body, 'logo_image_url': data['field_sponsorer_image']['url'], } for field, value in expected_values.items(): self.assertEqual(getattr(school, field), value)
def assert_school_loaded(self, data): school = Organization.objects.get(uuid=UUID(data['uuid']), partner=self.partner) expected_values = { 'key': data['title'], 'name': data['field_school_name'], 'description': clean_html(data['field_school_description']['value']), 'logo_image_url': data['field_school_image_logo']['url'], 'banner_image_url': data['field_school_image_banner']['url'], } for field, value in expected_values.items(): self.assertEqual(getattr(school, field), value) self.assertEqual( sorted(school.tags.names()), ['charter', 'displayed_on_schools_and_partners_page', 'founder'])
def process_node(self, data): # NOTE: Some titles in Drupal have the form "UC BerkeleyX" however, course keys (for which we use the # organization key) cannot contain spaces. key = data['title'].replace(' ', '') uuid = UUID(data['uuid']) defaults = { 'name': data['field_school_name'], 'description': clean_html(data['field_school_description']['value']), 'logo_image_url': self._get_nested_url(data.get('field_school_image_logo')), 'banner_image_url': self._get_nested_url(data.get('field_school_image_banner')), 'partner': self.partner, } try: school = Organization.objects.get(uuid=uuid, partner=self.partner) Organization.objects.filter(pk=school.pk).update(**defaults) logger.info('Updated school with key [%s].', school.key) except Organization.DoesNotExist: # NOTE: Some organizations' keys do not match the title. For example, "UC BerkeleyX" courses use # BerkeleyX as the key. Those fixes will be made manually after initial import, and we don't want to # override them with subsequent imports. Thus, we only set the key when creating a new organization. defaults['key'] = key defaults['uuid'] = uuid school = Organization.objects.create(**defaults) logger.info('Created school with key [%s].', school.key) self.set_tags(school, data) logger.info('Processed school with key [%s].', school.key) return school
def to_internal_value(self, data): """ Cleans incoming HTML to strip some styling that word processors might inject when copying/pasting. """ data = super().to_internal_value(data) return clean_html(data) if data else data