Sluggard/sluggard/sluggard.py
2024-10-24 16:35:22 +02:00

390 lines
37 KiB
Python

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*<a href=\".*?"\>(.*?)'
pattern_title2 = r'<h3 class="font-thin m-t-none m-b-none"><a href=".*?">(.*?)</a></h3>'
pattern_author_name = r'<a href="https:\/\/ma\.simulise\.com\/p\/\d+".*?>\s*(.*?)\s*'
pattern_timestamp = r'<time class="timeago" data-toggle="tooltip" title="(\d{2}-\d{2}-\d{4} \d{2}:\d{2})" datetime=".*?"'
pattern_content = r'<p class="m-b-none">\s*(.*?)\s*<\/p>'
pattern_tags = r'<a href="#".*?>(.*?)<\/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