import requests import json import re from .user import User from .school import School from .community import Community from .portfolio import Portfolio, Banner from .exceptions import sluggardException, InvalidJsonResponse from .utils import get_value_deep_key class Sluggard: loads = json.loads dumps = json.dumps def __init__(self, csrf_token="", cookie="", tenant="", xsrf=""): self.last_response = {} self.url = "https://api.simulise.com/graphql" self.tenant_url = f'https://{tenant}.simulise.com' self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; rv:124.0) Gecko/20100101 Firefox/124.0", "Accept": "application/json", "Accept-Language": "en-US,en;q=0.5", "Content-Type": "application/json", "Content-Disposition": None, "x-csrf-token": csrf_token, "x-requested-with": "XMLHttpRequest", "Cookie": f'simulise_session_production={cookie}; simulise_legacy_session_production={cookie}; XSRF-TOKEN={xsrf}', "DNT": "1" } self.session = requests.Session() def school_name_search(self, name): data = { "query": "query authenticationRealmSearch($query: String!) {\n authenticationRealmSearch(query: $query) {\n ...authenticationRealmFields __typename }\n}\n fragment authenticationRealmFields on AuthenticationRealm {\n id key sso idp {\n name logo __typename }\n logo name i18n {\n lang type __typename }\n alias permalink __typename }", "variables": {"query": name} } try: response = self.session.post(self.url, json=data) response_json = response.json() if 'data' in response_json and 'authenticationRealmSearch' in response_json['data']: if not response_json['data']['authenticationRealmSearch']: raise InvalidJsonResponse("Empty response", "Authentication Realm search returned empty array") for info in response_json['data']['authenticationRealmSearch']: school_info = { 'id': info['id'], 'key': info['key'], 'sso': info['sso'], 'idp_name': info['idp']['name'], 'idp_logo': info['idp']['logo'], 'school_logo': info['logo'], 'school_name': info['name'], 'school_permalink': info['permalink'] } return School.search_from_dict(school_info) else: raise InvalidJsonResponse("Invalid response format", "Response does not contain expected data structure") except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e def add__reflect(self, assignedassignment_id, user_number): data = {"query":"mutation assignedAssignmentOtherReflectionInvite($input: AssignedAssignmentOtherReflectionInviteInput!) {\n response: assignedAssignmentOtherReflectionInvite(input: $input) {\n assignedAssignment {\n id\n otherReflectionUsers {\n ...assignmentAssignedUserFields\n ...userAutocompleteFieldsFragment\n __typename\n }\n reflectionIsOptionalAndUncompleted\n ...assignedAssignmentOtherReflectionInvitationsFields\n __typename\n }\n ...mutationFields\n __typename\n }\n}\n\nfragment assignmentAssignedUserFields on User {\n id\n name\n avatar\n username\n permalink\n __typename\n}\n\nfragment userAutocompleteFieldsFragment on User {\n autocompletion {\n id\n text\n icon\n value\n avatar\n caption\n __typename\n }\n __typename\n}\n\nfragment assignedAssignmentOtherReflectionInvitationsFields on AssignedAssignment {\n otherReflectionInvitations {\n id\n user {\n ...assignmentAssignedUserFields\n __typename\n }\n createdAt\n isDeclined\n declinedAt\n submittedAt\n isSubmitted\n isProgressed\n __typename\n }\n __typename\n}\n\nfragment mutationFields on MutationPayload {\n status {\n success\n errors {\n name\n messages\n __typename\n }\n __typename\n }\n __typename\n}","variables":{"input":{"users":["310397"],"assignmentAssigned":"28fd494a-1eeb-4bc3-86df-2284da036a33"}}} try: response = self.session.post(self.url, json=data) response_json = response.json() print(response_json) print(data) except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e def discover_user(self, user): data = {"query": f"query dashboardDiscoverUser($id: String!) {{ user(id: $id) {{ id username primaryRole groupsActive {{ ...dashboardUserTileGroupsFragment __typename }} dashboardTiles {{ id key title isHidden canBeHidden __typename }} __typename }} viewer {{ id tenant {{ id settings {{ goalsLargerOnDashboard __typename }} __typename }} username primaryRole groupsActive {{ ...dashboardUserTileGroupsFragment __typename }} externalInvitationCount __typename }} }} fragment dashboardUserTileGroupsFragment on Group {{ __typename ... on Entity {{ id __typename }} ... on WorkGroup {{ id name icon permalink __typename }} ... on SchoolGroup {{ id name icon path permalink __typename }} ... on VirtualGroup {{ id name icon permalink __typename }} }}" , "variables": {"id": user}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() return User.discover_from_dict(response_json) except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e except AttributeError as e: raise sluggardException("Error accessing 'groupsActive' attribute in user_info") from e def get_community_recent_post(self, user): data = {"query": "query dashboardTileCommunityActivity($id: String!) {\n activity: user(id: $id) {\n id\n portfolioRecentCommunityItems {\n id\n icon\n title\n author {\n id\n name\n avatar\n username\n portfolioPermalink\n __typename\n }\n permalink\n createdAt\n __typename\n }\n __typename\n }\n}" , "variables": {"id": user}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() return Community.from_dict(response_json) except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e def get_community_posts(self): response = self.session.get(self.tenant_url + "/community/stream/filter?combine=false", headers=self.headers) response_json = response.json() pattern_activity_id = r'data-activity-id="(\d+)"' pattern_real_id = r'data-activity-real-id="([a-f0-9\-]+)"' pattern_title = r'\s*(.*?)' pattern_title2 = r'

(.*?)

' pattern_author_name = r'\s*(.*?)\s*' pattern_timestamp = r'(.*?)<\/a>' pattern_image_link = r'background: url\((.*?)\) no-repeat center;' activity_ids = re.findall(pattern_activity_id, response_json['elements']) real_ids = re.findall(pattern_real_id, response_json['elements']) titles = re.findall(pattern_title, response_json['elements']) author_names = re.findall(pattern_author_name, response_json['elements']) timestamps = re.findall(pattern_timestamp, response_json['elements']) contents = re.findall(pattern_content, response_json['elements']) tags = re.findall(pattern_tags, response_json['elements']) image_links = re.findall(pattern_image_link, response_json['elements']) max_length = max(len(activity_ids), len(real_ids), len(titles), len(author_names), len(timestamps), len(contents), len(tags), len(image_links)) posts = [] for i in range(max_length): post = { "activity_id": activity_ids[i] if i < len(activity_ids) else None, "real_id": real_ids[i] if i < len(real_ids) else None, "title": titles[i] if i < len(titles) else None, "author": { "name": author_names[i] if i < len(author_names) else None, }, "timestamp": timestamps[i] if i < len(timestamps) else None, "content": contents[i] if i < len(contents) else None, "tags": tags[i].split(', ') if i < len(tags) else None, "image_link": image_links[i] if i < len(image_links) else None, } posts.append(post) json_data = json.dumps(posts, indent=4) print(json_data) def badges_list(self, user=str, page=int): try: data = { "query": "query badgesReport($id: String!, $page: Int!) {\n badgesReport: user(id: $id) {\n id\n name\n about\n label {\n text\n __typename\n }\n avatar\n username\n permalink\n primaryRole\n badges(first: 10, page: $page) {\n ...badgePaginatorFragment\n __typename\n }\n __typename\n }\n viewer {\n id\n avatar\n username\n primaryRole\n __typename\n }\n}\n\nfragment badgePaginatorFragment on AssignedBadgePaginator {\n data {\n id\n image\n weight\n badge {\n id\n name\n levels\n criteria {\n id\n name\n __typename\n }\n __typename\n }\n createdAt\n userAssignment {\n id\n assignment {\n id\n icon\n title\n __typename\n }\n permalink\n __typename\n }\n translatedWeight\n __typename\n }\n paginatorInfo {\n total\n lastPage\n currentPage\n hasMorePages\n __typename\n }\n __typename\n}", "variables": {"id": user, "page": page} } response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() return User.badges_from_dict(response_json) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def get_portfolio_items(self, user): try: data = { "query": "query dashboardTilePortfolioItems($id: String!) {\n dashboard: user(id: $id) {\n id\n portfolioItems(first: 5) {\n data {\n id\n icon\n title\n author {\n id\n name\n __typename\n }\n permalink\n createdAt\n __typename\n }\n paginatorInfo {\n total\n __typename\n }\n __typename\n }\n portfolioPermalink\n __typename\n }\n}", "variables": {"id": user} } response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() return User.portfolio_from_dict(response_json) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def user_info(self, user_id): try: data = { "query": "query dashboardTileProfile($id: String!, $lookingAtOwnProfile: Boolean!, $viewingExternal: Boolean!) { dashboard: user(id: $id) { id name about avatar username external @include(if: $viewingExternal) firstname primaryRole renderedLabel externalInvited @include(if: $viewingExternal) changelogsUnread @include(if: $lookingAtOwnProfile) canBeImpersonated @skip(if: $lookingAtOwnProfile) profileCompletion @include(if: $lookingAtOwnProfile) { actions { action completed translation __typename } percentage __typename } __typename } }", "variables": {"id": user_id, "lookingAtOwnProfile": False, "viewingExternal": False} } response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() user_data = response_json.get('data', {}).get('dashboard', {}) user_info = { 'id': user_data.get('id', ''), 'avatar': user_data.get('avatar', ''), 'name': user_data.get('name', ''), 'about': user_data.get('about', ''), 'username': user_data.get('username', ''), 'primary_role': user_data.get('primaryRole', ''), 'render_label': user_data.get('renderedLabel', ''), 'canBeImposter': user_data.get('canBeImpersonated', '') } return User.info_from_dict(user_info) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def user_assignments(self, user_id, page=int): filters = ["status:doover,finished_not_handed_in,in_progress,past_able_hand_in,pending,under_review"] data = { "query": "query userAssignedAssignments($userId: String!, $page: Int!, $filters: [String!]!, $orderBy: UserAssignedAssignmentsOrder) {\n result: user(id: $userId) {\n id\n ...userAssignmentsAssignedContainer\n __typename\n }\n}\n\nfragment userAssignmentsAssignedContainer on User {\n assignmentsAssignedContainer(page: $page, filters: $filters, orderBy: $orderBy) {\n data {\n __typename\n ... on AssignedAssignment {\n id\n plan {\n id\n title\n __typename\n }\n state\n isLate\n endDate\n canHandIn\n permalink\n assignedAt\n approvedAt\n assignment {\n id\n icon\n title\n cover {\n thumbnail\n __typename\n }\n subjects: labels(only: [SUBJECTS]) {\n id\n name\n topic {\n id\n __typename\n }\n abbreviation\n autocompletion {\n id\n text\n caption\n __typename\n }\n __typename\n }\n __typename\n }\n deliveredAt\n statusMessage {\n text\n color\n status\n shortText\n __typename\n }\n totalDeliverables\n deliveredDeliverables\n assignedAssignmentPlan {\n id\n permalink\n __typename\n }\n __typename\n }\n ... on AssignedAssignmentGroup {\n id\n plan {\n id\n title\n __typename\n }\n state\n endDate\n statusMessage {\n color\n shortText\n __typename\n }\n minAssignments\n assignedAssignments {\n id\n state\n isLate\n permalink\n canHandIn\n assignedAt\n approvedAt\n assignment {\n id\n title\n subjects: labels(only: [SUBJECTS]) {\n id\n name\n abbreviation\n autocompletion {\n id\n text\n caption\n __typename\n }\n __typename\n }\n __typename\n }\n deliveredAt\n statusMessage {\n color\n status\n shortText\n __typename\n }\n totalDeliverables\n deliveredDeliverables\n assignedAssignmentPlan {\n id\n permalink\n __typename\n }\n __typename\n }\n __typename\n }\n }\n paginatorInfo {\n ...paginatorFieldsFragment\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment paginatorFieldsFragment on PaginatorInfo {\n total\n lastPage\n lastItem\n firstItem\n currentPage\n hasMorePages\n __typename\n}", "variables": { "filters": filters, "page": page, "orderBy": { "field": "TITLE", "direction": "ASC" }, "userId": user_id } } try: response = self.session.post(self.url, headers=self.headers, json=data) return User.assignments_from_dict(response.json()) except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e # Unfinished def view_assignment(self, Assignedassignment_id): data = {"query": "query getSingleUserAssignment($assignmentAssigned: ID!) {\n viewer {\n username\n assignmentAssigned(id: $assignmentAssigned) {\n ...assignedAssignmentFields\n __typename\n }\n ...assignmentAssignedUserFields\n __typename\n }\n}\n\nfragment assignedAssignmentFields on AssignedAssignment {\n id\n user {\n ...assignmentAssignedUserFields\n __typename\n }\n state\n isLate\n isPast\n endDate\n approver {\n ...assignmentAssignedUserFields\n __typename\n }\n reviewers {\n ...assignmentAssignedUserFields\n __typename\n }\n inProcess\n startable\n isApproved\n isArchived\n canReflect\n assignment {\n badges {\n showPercentages\n __typename\n }\n ...assignmentFields\n ...assignmentDeliverablesFields\n ...assignmentDeliverablePagesFields\n __typename\n }\n canWithdraw\n lastAuditLog {\n id\n createdAt\n __typename\n }\n endDateIsSoft\n statusMessage {\n text\n color\n __typename\n }\n assignedBadges {\n id\n weight\n badge {\n id\n __typename\n }\n __typename\n }\n connectableKey\n currentReviewer {\n ...assignmentAssignedUserFields\n __typename\n }\n endDateFormatted\n canAnswerFeedback\n approvedAtFormatted\n deliveredAtFormatted\n reflectionIsOptional\n reflectionIsOptionalAndUncompleted\n ...assignmentUserReflectionsFields\n ...assignedAssignmentFeedbackFields\n ...assignmentAssignedDeliveredFields\n ...assignedAssignmentOtherReflectionInvitationsFields\n __typename\n}\n\nfragment assignmentAssignedUserFields on User {\n id\n name\n avatar\n username\n permalink\n __typename\n}\n\nfragment assignmentFields on Assignment {\n id\n icon\n tags: labels(only: [TAGS]) {\n id\n name\n shortName: name(length: 30)\n ...autocompleteWithValueFieldsFragment\n __typename\n }\n title\n cover {\n id\n url\n __typename\n }\n labels {\n id\n name\n topic {\n id\n type\n name\n icon\n color\n __typename\n }\n shortName: name(length: 30)\n ...autocompleteWithValueFieldsFragment\n __typename\n }\n blocks {\n id\n type\n title\n content\n isPresentable\n data {\n ... on ContentBlockSimuliseFileData {\n id\n file {\n id\n type\n icon\n size\n title\n preview\n extension\n downloadUrl\n renderedPreviewUrl\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n badges {\n id\n name\n type\n levels\n blocks {\n id\n type\n content\n __typename\n }\n weights {\n color\n level\n title\n image\n percentage\n __typename\n }\n criteria {\n id\n name\n order\n texts {\n image {\n id\n thumbnail\n __typename\n }\n level\n formattedContent\n __typename\n }\n weight\n levels\n __typename\n }\n isOptional\n description\n singlePointConfig {\n negativeTitle\n positiveTitle\n negativeMessage\n positiveMessage\n __typename\n }\n __typename\n }\n subjects: labels(only: [SUBJECTS]) {\n id\n name\n shortName: name(length: 30)\n ...autocompleteWithValueFieldsFragment\n __typename\n }\n resources {\n ... on AssignmentResourceLink {\n id\n url\n title\n embed {\n type\n __typename\n }\n description\n previewImage\n __typename\n }\n ... on AssignmentResourceFile {\n id\n title\n attachment {\n id\n icon\n thumbnail\n downloadUrl\n renderedPreviewUrl\n __typename\n }\n __typename\n }\n __typename\n }\n isDeleted\n isArchived\n badgesCount\n feedbackCount\n reflectionOther {\n type\n min\n max\n __typename\n }\n optionalBadgesData {\n min\n max\n __typename\n }\n actualDeliverablesCount\n __typename\n}\n\nfragment assignmentDeliverablesFields on Assignment {\n deliverables {\n id\n type\n title\n sources\n minimum\n maximum\n multiple\n template {\n id\n title\n __typename\n }\n templates {\n key\n name\n icon\n fileType\n __typename\n }\n isOptional\n description\n requirements\n postMinWords\n postMaxWords\n plagiarismCheck {\n enabled\n eulaAcceptanceLabel\n eulaAcceptanceMessage\n eulaAcceptanceRequired\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment assignmentDeliverablePagesFields on Assignment {\n deliverablePages {\n id\n type\n title\n sources\n minimum\n template {\n id\n title\n createPageLink\n formattedDescription\n __typename\n }\n isOptional\n description\n requirements\n plagiarismCheck {\n enabled\n eulaAcceptanceLabel\n eulaAcceptanceMessage\n eulaAcceptanceRequired\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment assignmentUserReflectionsFields on AssignedAssignment {\n reflectionComments {\n id\n author {\n ...assignmentAssignedUserFields\n __typename\n }\n comment\n createdAt\n criterion {\n id\n __typename\n }\n __typename\n }\n singlePointComments {\n id\n author {\n ...assignmentAssignedUserFields\n __typename\n }\n negative\n positive\n createdAt\n criterion {\n id\n __typename\n }\n __typename\n }\n reflection {\n ...assignmentUserReflectionFields\n __typename\n }\n approverReflection {\n ...assignmentUserReflectionFields\n __typename\n }\n otherReflections {\n ...assignmentUserReflectionFields\n __typename\n }\n otherReflectionUsers {\n ...assignmentAssignedUserFields\n ...userAutocompleteFieldsFragment\n __typename\n }\n ...assignmentUserReflectionAutosaveFields\n __typename\n}\n\nfragment assignedAssignmentFeedbackFields on AssignedAssignment {\n feedback {\n id\n owner {\n ...assignmentAssignedUserFields\n __typename\n }\n files {\n id\n icon\n type\n title\n extension\n thumbnail\n downloadUrl\n renderedPreviewUrl\n __typename\n }\n feedback\n createdAt\n __typename\n }\n feedbackUsed\n hasFeedbackQuestionsLeft\n __typename\n}\n\nfragment assignmentAssignedDeliveredFields on AssignedAssignment {\n id\n delivered {\n id\n item {\n ... on MedialibraryFile {\n id\n type\n icon\n title\n thumbnail\n createdAt\n __typename\n }\n ... on PortfolioPage {\n ...deliverablePortfolioPageFields\n __typename\n }\n ... on PortfolioItem {\n ...deliverablePortfolioPostFields\n __typename\n }\n __typename\n }\n preview\n deliverable {\n id\n __typename\n }\n hasAnnotations\n urkundSubmission {\n id\n status\n optOut {\n message\n permalink\n __typename\n }\n errorReason\n __typename\n }\n turnitinSubmission {\n id\n status\n report {\n permalink\n isSignificant\n __typename\n }\n errorReason\n __typename\n }\n supportsAnnotations\n __typename\n }\n __typename\n}\n\nfragment assignedAssignmentOtherReflectionInvitationsFields on AssignedAssignment {\n otherReflectionInvitations {\n id\n user {\n ...assignmentAssignedUserFields\n __typename\n }\n createdAt\n isDeclined\n declinedAt\n submittedAt\n isSubmitted\n isProgressed\n __typename\n }\n __typename\n}\n\nfragment autocompleteWithValueFieldsFragment on Autocompletable {\n autocompletion {\n id\n text\n icon\n value\n avatar\n prefix\n caption\n __typename\n }\n __typename\n}\n\nfragment assignmentUserReflectionFields on AssignmentReflection {\n id\n data {\n badge\n optional\n criteria {\n level\n comments {\n id\n comment\n createdAt\n __typename\n }\n criterion\n singlePointComment {\n id\n negative\n positive\n createdAt\n __typename\n }\n __typename\n }\n __typename\n }\n author {\n ...assignmentAssignedUserFields\n __typename\n }\n createdAt\n __typename\n}\n\nfragment userAutocompleteFieldsFragment on User {\n autocompletion {\n id\n text\n icon\n value\n avatar\n caption\n __typename\n }\n __typename\n}\n\nfragment assignmentUserReflectionAutosaveFields on AssignedAssignment {\n reflectionAutosaves {\n id\n badge {\n id\n name\n __typename\n }\n author {\n id\n name\n __typename\n }\n weight\n comment\n updatedAt\n criterion {\n id\n name\n __typename\n }\n negativeComment\n positiveComment\n __typename\n }\n __typename\n}\n\nfragment deliverablePortfolioPageFields on PortfolioPage {\n id\n title\n icon\n author {\n id\n name\n __typename\n }\n template {\n id\n title\n __typename\n }\n permalink\n createdAt\n featuredImage {\n id\n thumbnail\n __typename\n }\n __typename\n}\n\nfragment deliverablePortfolioPostFields on PortfolioItem {\n id\n icon\n title\n types {\n key\n name\n icon\n fileType\n __typename\n }\n author {\n id\n name\n __typename\n }\n permalink\n draftedAt\n createdAt\n previewImage\n collaboration {\n id\n callaboratorCount\n __typename\n }\n __typename\n}", "variables": {"assignmentAssigned": Assignedassignment_id}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() return User.assignments_from_dict(response_json) except requests.exceptions.RequestException as e: raise sluggardException("Request failed") from e def unread_notification(self): data = {"query":"subscription listenForUnreadNotificationChanges {\n count: notificationsUnreadCount\n}"} try: response = self.session.post(self.url, headers=self.headers, json=data) return response.json() except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def get_portfolio_banner(self): data = {"query": "query getPortfolioBannerForSettings {\n viewer {\n id\n portfolioBanner {\n ...portfolioBannerFields\n __typename\n }\n __typename\n }\n staticPortfolioBanners {\n ...staticPortfolioBannerFields\n __typename\n }\n}\n\nfragment portfolioBannerFields on PortfolioBanner {\n ... on MedialibraryFile {\n id\n url\n __typename\n }\n ... on StaticPortfolioBanner {\n ...staticPortfolioBannerFields\n __typename\n }\n __typename\n}\n\nfragment staticPortfolioBannerFields on StaticPortfolioBanner {\n key\n url\n name\n group\n __typename\n}"} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() banner_info = { 'user_id': response_json['data']['viewer']['portfolioBanner']['id'], 'banner_url': response_json['data']['viewer']['portfolioBanner']['url'], 'static_banners': [] } static_banners = [] for banner in response_json['data']['staticPortfolioBanners']: banner_data = { 'banner_filename': banner['key'], 'banner_url': banner['url'], 'banner_name': banner['name'], 'banner_group': banner['group'] } static_banners.append(banner_data) banner_info['static_banners'] = static_banners return User.banner_from_dict(banner_info) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def get_unsplash_banner(self, query, first=int, page=int): data = {"query": "query medialibraryPagedUnsplashImages($query: String, $first: Int!, $page: Int!) {\n unsplashImages: medialibraryUnsplashSearch(\n query: $query\n first: $first\n page: $page\n ) {\n data {\n id\n user {\n id\n name\n permalink\n __typename\n }\n title\n preview\n blurHash\n permalink\n createdAt\n aspectRatio\n description\n downloadUrl\n __typename\n }\n paginatorInfo {\n hasMorePages\n __typename\n }\n __typename\n }\n}", "variables": {"page": page, "first": first, "query":query}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() unsplash_info = { 'unsplash_data': [] } unsplash_data = [] for data in response_json['data']['unsplashImages']['data']: picture_data = { 'picture_id': data['id'], 'picture_title': data['title'], 'picture_preview': data['preview'], 'picture_permalink': data['permalink'], 'picture_date': data['createdAt'], 'picture_aspectRatio': data['aspectRatio'], 'picture_description': data['description'], 'picture_downloadLink': data['downloadUrl'], 'unsplash_userId': data['user']['id'], 'unsplash_name': data['user']['name'], 'unsplash_permalink': data['user']['permalink'] } unsplash_data.append(picture_data) unsplash_info['unsplash_data'] = unsplash_data return User.unsplash_from_dict(unsplash_info) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def add_banner_from_unsplash(self, picture_id): data = {"query": "mutation medialibraryImportFromUnsplash($input: MedialibraryImportFromUnsplashInput!) {\n response: medialibraryImportFromUnsplash(input: $input) {\n file {\n ...medialibraryFilesFileFieldsFragment\n __typename\n }\n ...mutationFields\n __typename\n }\n}\n\nfragment medialibraryFilesFileFieldsFragment on MedialibraryFile {\n id\n size\n type\n icon\n title\n uploader {\n id\n name\n permalink\n __typename\n }\n extension\n createdAt\n thumbnail\n downloadUrl\n canBeEdited\n canBeDeleted\n thumbnailBlurHash\n renderedPreviewUrl\n __typename\n}\n\nfragment mutationFields on MutationPayload {\n status {\n success\n errors {\n name\n messages\n __typename\n }\n __typename\n }\n __typename\n}", "variables": {"input": {"id": picture_id, "context": "USER"}}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() banner_info = { 'file_id': response_json['data']['response']['file']['id'], 'file_size': response_json['data']['response']['file']['size'], 'file_title': response_json['data']['response']['file']['title'] } return Banner.add_from_dict(banner_info) except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def get_banner_library(self, first=20, page=1, query=""): data = {"query": "query medialibraryPagedFiles($context: MedialibraryContext, $query: String, $types: [MedialibraryFileType!], $first: Int!, $page: Int!) {\n medialibraryFiles(\n context: $context\n query: $query\n types: $types\n first: $first\n page: $page\n ) {\n data {\n ...medialibraryFilesFileFieldsFragment\n __typename\n }\n paginatorInfo {\n hasMorePages\n __typename\n }\n __typename\n }\n}\n\nfragment medialibraryFilesFileFieldsFragment on MedialibraryFile {\n id\n size\n type\n icon\n title\n uploader {\n id\n name\n permalink\n __typename\n }\n extension\n createdAt\n thumbnail\n downloadUrl\n canBeEdited\n canBeDeleted\n thumbnailBlurHash\n renderedPreviewUrl\n __typename\n}", "variables": {"page":page, "first": first, "query": query, "types":["IMAGE"], "context": "USER"}} try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() library_info = { 'images_data': [] } images_data = [] for data in response_json['data']['medialibraryFiles']['data']: image_data = { "image_id": data['id'], "image_size": data['size'], "image_title": data['title'], "image_date": data['createdAt'], "image_previewLink": data['thumbnail'], "image_downloadLink": data['downloadUrl'], "image_renderedLink": data['renderedPreviewUrl'], "image_uploader_id": data['uploader']['id'], "image_uploader_name": data['uploader']['name'], "image_uploader_permalink": data['uploader']['permalink'] } images_data.append(image_data) library_info["images_data"] = images_data return library_info except requests.exceptions.RequestException as e: return f"An error occurred: {e}" def delete_picture_banner(self, image_id): data = { "query": "mutation medialibraryDeleteFile($input: MedialibraryFileDeleteInput!) {\n response: medialibraryFileDelete(input: $input) {\n ...mutationFields\n __typename\n }\n}\n\nfragment mutationFields on MutationPayload {\n status {\n success\n errors {\n name\n messages\n __typename\n }\n __typename\n }\n __typename\n}", "variables": {"input": {"id": image_id, "context": "USER"}} } try: response = self.session.post(self.url, headers=self.headers, json=data) response_json = response.json() response_data = response_json.get('data', {}) response_status = response_data.get('response', {}).get('status', {}) if response_status.get('success', False): delete_info = { 'Status': response_status.get('success'), 'Error': None } else: error_messages = response_status.get('errors', []) error_list = [{'name': error['name'], 'messages': error['messages'][0]} for error in error_messages] delete_info = { 'Status': response_status.get('success', False), 'Errors': error_list } return delete_info except requests.exceptions.RequestException as e: return f"An error occurred: {e}" # def upload_portfolio_banner(self, filename): # # Define the operations part of the request # operations = "mutation medialibraryUploadFile($input: MedialibraryUploadFileInput!) {\n response: medialibraryUploadFile(input: $input) {\n file {\n ...medialibraryFilesFileFieldsFragment\n __typename\n }\n ...mutationFields\n __typename\n }\n}\n\nfragment medialibraryFilesFileFieldsFragment on MedialibraryFile {\n id\n size\n type\n icon\n title\n uploader {\n id\n name\n permalink\n __typename\n }\n extension\n createdAt\n thumbnail\n downloadUrl\n canBeEdited\n canBeDeleted\n thumbnailBlurHash\n renderedPreviewUrl\n __typename\n}\n\nfragment mutationFields on MutationPayload {\n status {\n success\n errors {\n name\n messages\n __typename\n }\n __typename\n }\n __typename\n}" # # Define the map part of the request # map_data = { # '1': ['variables.input.file'] # } # # Prepare the multipart/form-data request # files = { # 'operations': (operations), # 'map': (str(map_data)), # '1': (filename, open(filename, 'rb'), 'image/jpeg') # } # # Send the request # response = self.session.post(self.url, headers=self.headers, files=files) # print(files) # # Ensure the file is closed after the request # files['1'][1].close() # # Print the response for debugging # print(response.text) # # Parse and return the JSON response # response_json = response.json() # return response_json