mirror of https://gitlab.com/bashrc2/epicyon
Optionally add shared items to actor attachments
parent
a3472c649f
commit
ed742cd1f1
44
daemon.py
44
daemon.py
|
@ -268,6 +268,7 @@ from webapp_welcome import html_welcome_screen
|
||||||
from webapp_welcome import is_welcome_screen_complete
|
from webapp_welcome import is_welcome_screen_complete
|
||||||
from webapp_welcome_profile import html_welcome_profile
|
from webapp_welcome_profile import html_welcome_profile
|
||||||
from webapp_welcome_final import html_welcome_final
|
from webapp_welcome_final import html_welcome_final
|
||||||
|
from shares import add_shares_to_actor
|
||||||
from shares import merge_shared_item_tokens
|
from shares import merge_shared_item_tokens
|
||||||
from shares import run_federated_shares_daemon
|
from shares import run_federated_shares_daemon
|
||||||
from shares import run_federated_shares_watchdog
|
from shares import run_federated_shares_watchdog
|
||||||
|
@ -5268,6 +5269,24 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
remove_shared_item(base_dir,
|
remove_shared_item(base_dir,
|
||||||
share_nickname, share_domain, item_id,
|
share_nickname, share_domain, item_id,
|
||||||
'shares')
|
'shares')
|
||||||
|
# remove shared items from the actor attachments
|
||||||
|
# https://codeberg.org/fediverse/fep/
|
||||||
|
# src/branch/main/fep/0837/fep-0837.md
|
||||||
|
actor = \
|
||||||
|
self._get_instance_url(calling_domain) + \
|
||||||
|
'/users/' + share_nickname
|
||||||
|
person_cache = self.server.person_cache
|
||||||
|
actor_json = get_person_from_cache(base_dir,
|
||||||
|
actor, person_cache)
|
||||||
|
if add_shares_to_actor(base_dir,
|
||||||
|
share_nickname, share_domain,
|
||||||
|
actor_json,
|
||||||
|
self.server.max_shares_on_profile):
|
||||||
|
store_person_in_cache(base_dir, actor,
|
||||||
|
actor_json, person_cache, False)
|
||||||
|
actor_filename = acct_dir(base_dir, share_nickname,
|
||||||
|
share_domain) + '.json'
|
||||||
|
save_json(actor_json, actor_filename)
|
||||||
|
|
||||||
if calling_domain.endswith('.onion') and onion_domain:
|
if calling_domain.endswith('.onion') and onion_domain:
|
||||||
origin_path_str = 'http://' + onion_domain + users_path
|
origin_path_str = 'http://' + onion_domain + users_path
|
||||||
|
@ -22415,6 +22434,9 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
print('Adding wanted item')
|
print('Adding wanted item')
|
||||||
shares_file_type = 'wanted'
|
shares_file_type = 'wanted'
|
||||||
on_profile = False
|
on_profile = False
|
||||||
|
if fields.get('onProfile'):
|
||||||
|
if fields['onProfile'] == 'on':
|
||||||
|
on_profile = True
|
||||||
add_share(self.server.base_dir,
|
add_share(self.server.base_dir,
|
||||||
self.server.http_prefix,
|
self.server.http_prefix,
|
||||||
nickname,
|
nickname,
|
||||||
|
@ -22433,6 +22455,26 @@ class PubServer(BaseHTTPRequestHandler):
|
||||||
self.server.low_bandwidth,
|
self.server.low_bandwidth,
|
||||||
self.server.content_license_url,
|
self.server.content_license_url,
|
||||||
on_profile)
|
on_profile)
|
||||||
|
if post_type == 'newshare':
|
||||||
|
# add onProfile items to the actor attachments
|
||||||
|
# https://codeberg.org/fediverse/fep/src/branch/main/fep/0837/fep-0837.md
|
||||||
|
actor = \
|
||||||
|
self._get_instance_url(calling_domain) + \
|
||||||
|
'/users/' + nickname
|
||||||
|
person_cache = self.server.person_cache
|
||||||
|
actor_json = get_person_from_cache(self.server.base_dir,
|
||||||
|
actor, person_cache)
|
||||||
|
if add_shares_to_actor(self.server.base_dir,
|
||||||
|
nickname, self.server.domain,
|
||||||
|
actor_json,
|
||||||
|
self.server.max_shares_on_profile):
|
||||||
|
store_person_in_cache(self.server.base_dir, actor,
|
||||||
|
actor_json, person_cache, False)
|
||||||
|
actor_filename = acct_dir(self.server.base_dir,
|
||||||
|
nickname,
|
||||||
|
self.server.domain) + '.json'
|
||||||
|
save_json(actor_json, actor_filename)
|
||||||
|
|
||||||
if filename:
|
if filename:
|
||||||
if os.path.isfile(filename):
|
if os.path.isfile(filename):
|
||||||
try:
|
try:
|
||||||
|
@ -23667,6 +23709,8 @@ def run_daemon(max_hashtags: int,
|
||||||
|
|
||||||
httpd.starting_daemon = True
|
httpd.starting_daemon = True
|
||||||
|
|
||||||
|
httpd.max_shares_on_profile = 8
|
||||||
|
|
||||||
# load a list of nicknames for accounts blocking military instances
|
# load a list of nicknames for accounts blocking military instances
|
||||||
httpd.block_military = load_blocked_military(base_dir)
|
httpd.block_military = load_blocked_military(base_dir)
|
||||||
|
|
||||||
|
|
251
shares.py
251
shares.py
|
@ -23,6 +23,8 @@ from session import post_json
|
||||||
from session import post_image
|
from session import post_image
|
||||||
from session import create_session
|
from session import create_session
|
||||||
from session import get_json_valid
|
from session import get_json_valid
|
||||||
|
from utils import remove_html
|
||||||
|
from utils import get_media_extensions
|
||||||
from utils import acct_handle_dir
|
from utils import acct_handle_dir
|
||||||
from utils import remove_eol
|
from utils import remove_eol
|
||||||
from utils import has_object_string_type
|
from utils import has_object_string_type
|
||||||
|
@ -1944,3 +1946,252 @@ def share_category_icon(category: str) -> str:
|
||||||
if category_icons.get(category):
|
if category_icons.get(category):
|
||||||
return category_icons[category]
|
return category_icons[category]
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
|
def _currency_to_wikidata(currency_type: str) -> str:
|
||||||
|
"""Converts a currency type, such as USD, into a wikidata reference
|
||||||
|
"""
|
||||||
|
currencies = {
|
||||||
|
"GBP": "https://www.wikidata.org/wiki/Q25224",
|
||||||
|
"EUR": "https://www.wikidata.org/wiki/Q4916",
|
||||||
|
"CAD": "https://www.wikidata.org/wiki/Q1104069",
|
||||||
|
"USD": "https://www.wikidata.org/wiki/Q4917",
|
||||||
|
"AUD": "https://www.wikidata.org/wiki/Q259502",
|
||||||
|
"PKR": "https://www.wikidata.org/wiki/Q188289",
|
||||||
|
"PEN": "https://www.wikidata.org/wiki/Q204656",
|
||||||
|
"PAB": "https://www.wikidata.org/wiki/Q210472",
|
||||||
|
"PHP": "https://www.wikidata.org/wiki/Q17193",
|
||||||
|
"RWF": "https://www.wikidata.org/wiki/Q4741",
|
||||||
|
"NZD": "https://www.wikidata.org/wiki/Q1472704",
|
||||||
|
"MXN": "https://www.wikidata.org/wiki/Q4730",
|
||||||
|
"JMD": "https://www.wikidata.org/wiki/Q209792",
|
||||||
|
"ISK": "https://www.wikidata.org/wiki/Q131473",
|
||||||
|
"EGP": "https://www.wikidata.org/wiki/Q199462",
|
||||||
|
"CNY": "https://www.wikidata.org/wiki/Q39099",
|
||||||
|
"AFN": "https://www.wikidata.org/wiki/Q199471",
|
||||||
|
"AWG": "https://www.wikidata.org/wiki/Q232270",
|
||||||
|
"AZN": "https://www.wikidata.org/wiki/Q483725",
|
||||||
|
"BYN": "https://www.wikidata.org/wiki/Q21531507",
|
||||||
|
"BZD": "https://www.wikidata.org/wiki/Q275112",
|
||||||
|
"BOB": "https://www.wikidata.org/wiki/Q200737",
|
||||||
|
"BAM": "https://www.wikidata.org/wiki/Q179620",
|
||||||
|
"BWP": "https://www.wikidata.org/wiki/Q186794",
|
||||||
|
"BGN": "https://www.wikidata.org/wiki/Q172540",
|
||||||
|
"BRL": "https://www.wikidata.org/wiki/Q173117",
|
||||||
|
"KHR": "https://www.wikidata.org/wiki/Q204737",
|
||||||
|
"UYU": "https://www.wikidata.org/wiki/Q209272",
|
||||||
|
"DOP": "https://www.wikidata.org/wiki/Q242922",
|
||||||
|
"CRC": "https://www.wikidata.org/wiki/Q242915",
|
||||||
|
"HRK": "https://www.wikidata.org/wiki/Q595634",
|
||||||
|
"CUP": "https://www.wikidata.org/wiki/Q201505",
|
||||||
|
"CZK": "https://www.wikidata.org/wiki/Q131016",
|
||||||
|
"NOK": "https://www.wikidata.org/wiki/Q132643",
|
||||||
|
"GHS": "https://www.wikidata.org/wiki/Q183530",
|
||||||
|
"GTQ": "https://www.wikidata.org/wiki/Q207396",
|
||||||
|
"HNL": "https://www.wikidata.org/wiki/Q4719",
|
||||||
|
"HUF": "https://www.wikidata.org/wiki/Q47190",
|
||||||
|
"IDR": "https://www.wikidata.org/wiki/Q41588",
|
||||||
|
"INR": "https://www.wikidata.org/wiki/Q80524",
|
||||||
|
"IRR": "https://www.wikidata.org/wiki/Q188608",
|
||||||
|
"ILS": "https://www.wikidata.org/wiki/Q131309",
|
||||||
|
"JPY": "https://www.wikidata.org/wiki/Q8146",
|
||||||
|
"KRW": "https://www.wikidata.org/wiki/Q202040",
|
||||||
|
"LAK": "https://www.wikidata.org/wiki/Q200055",
|
||||||
|
"MKD": "https://www.wikidata.org/wiki/Q177875",
|
||||||
|
"MYR": "https://www.wikidata.org/wiki/Q163712",
|
||||||
|
"MUR": "https://www.wikidata.org/wiki/Q212967",
|
||||||
|
"MNT": "https://www.wikidata.org/wiki/Q183435",
|
||||||
|
"MZN": "https://www.wikidata.org/wiki/Q200753",
|
||||||
|
"NIO": "https://www.wikidata.org/wiki/Q207312",
|
||||||
|
"NGN": "https://www.wikidata.org/wiki/Q203567",
|
||||||
|
"PYG": "https://www.wikidata.org/wiki/Q207514",
|
||||||
|
"PLN": "https://www.wikidata.org/wiki/Q123213",
|
||||||
|
"RON": "https://www.wikidata.org/wiki/Q131645",
|
||||||
|
"RUB": "https://www.wikidata.org/wiki/Q41044",
|
||||||
|
"RSD": "https://www.wikidata.org/wiki/Q172524",
|
||||||
|
"SOS": "https://www.wikidata.org/wiki/Q4603",
|
||||||
|
"ZAR": "https://www.wikidata.org/wiki/Q181907",
|
||||||
|
"CHF": "https://www.wikidata.org/wiki/Q25344",
|
||||||
|
"TWD": "https://www.wikidata.org/wiki/Q208526",
|
||||||
|
"THB": "https://www.wikidata.org/wiki/Q177882",
|
||||||
|
"TTD": "https://www.wikidata.org/wiki/Q242890",
|
||||||
|
"UAH": "https://www.wikidata.org/wiki/Q81893",
|
||||||
|
"VES": "https://www.wikidata.org/wiki/Q56349362",
|
||||||
|
"VEB": "https://www.wikidata.org/wiki/Q56349362",
|
||||||
|
"VND": "https://www.wikidata.org/wiki/Q192090"
|
||||||
|
}
|
||||||
|
currency_type = currency_type.upper()
|
||||||
|
for curr, curr_url in currencies.items():
|
||||||
|
if curr in currency_type:
|
||||||
|
return curr_url
|
||||||
|
return "https://www.wikidata.org/wiki/Q25224"
|
||||||
|
|
||||||
|
|
||||||
|
def _vf_share_id(share_id: str) -> str:
|
||||||
|
"""returns the share id
|
||||||
|
"""
|
||||||
|
share_id = share_id.replace('___', '://')
|
||||||
|
return share_id.replace('--', '/')
|
||||||
|
|
||||||
|
|
||||||
|
def vf_proposal_from_share(shared_item: {},
|
||||||
|
share_type: str,
|
||||||
|
publishes_direction: str,
|
||||||
|
reciprocal_direction: str) -> {}:
|
||||||
|
"""Returns a ValueFlows proposal from a shared item
|
||||||
|
"""
|
||||||
|
if not shared_item.get('shareId'):
|
||||||
|
return {}
|
||||||
|
om2_link = \
|
||||||
|
"http://www.ontology-of-units-of-measure.org/resource/om-2/"
|
||||||
|
share_id = _vf_share_id(shared_item['shareId'])
|
||||||
|
offer_item = {
|
||||||
|
"@context": [
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
{
|
||||||
|
"om2": om2_link,
|
||||||
|
"vf": "https://w3id.org/valueflows/",
|
||||||
|
"Proposal": "vf:Proposal",
|
||||||
|
"Intent": "vf:Intent",
|
||||||
|
"receiver": "vf:receiver",
|
||||||
|
"provider": "vf:provider",
|
||||||
|
"action": "vf:action",
|
||||||
|
"unitBased": "vf:unitBased",
|
||||||
|
"publishes": "vf:publishes",
|
||||||
|
"reciprocal": "vf:reciprocal",
|
||||||
|
"resourceClassifiedAs": "vf:resourceClassifiedAs",
|
||||||
|
"resourceConformsTo": "vf:resourceConformsTo",
|
||||||
|
"resourceQuantity": "vf:resourceQuantity",
|
||||||
|
"hasUnit": "om2:hasUnit",
|
||||||
|
"hasNumericalValue": "om2:hasNumericalValue"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"type": share_type,
|
||||||
|
"id": share_id,
|
||||||
|
"attributedTo": shared_item['actor'],
|
||||||
|
"name": shared_item['displayName'],
|
||||||
|
"content": shared_item['summary'],
|
||||||
|
"published": shared_item['published'],
|
||||||
|
"publishes": {
|
||||||
|
"type": "Intent",
|
||||||
|
"id": share_id + '#primary',
|
||||||
|
"action": "transfer",
|
||||||
|
"resourceQuantity": {
|
||||||
|
"hasUnit": "one",
|
||||||
|
"hasNumericalValue": str(shared_item['itemQty'])
|
||||||
|
},
|
||||||
|
publishes_direction: shared_item['actor']
|
||||||
|
},
|
||||||
|
"attachment": [],
|
||||||
|
"unitBased": False,
|
||||||
|
"to": "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
|
}
|
||||||
|
if shared_item.get('dfcId'):
|
||||||
|
offer_item['publishes']['resourceConformsTo'] = \
|
||||||
|
shared_item['dfcId']
|
||||||
|
if shared_item['category']:
|
||||||
|
offer_item['attachment'].append({
|
||||||
|
"type": "PropertyValue",
|
||||||
|
"name": "category",
|
||||||
|
"value": shared_item['category']
|
||||||
|
})
|
||||||
|
if shared_item['location']:
|
||||||
|
# pixelfed style representation of location
|
||||||
|
offer_item['location'] = {
|
||||||
|
"type": "Place",
|
||||||
|
"name": shared_item['location'].title()
|
||||||
|
}
|
||||||
|
if shared_item['imageUrl']:
|
||||||
|
if '://' in shared_item['imageUrl']:
|
||||||
|
file_extension = None
|
||||||
|
accepted_types = get_media_extensions()
|
||||||
|
for mtype in accepted_types:
|
||||||
|
if shared_item['imageUrl'].endswith('.' + mtype):
|
||||||
|
if mtype == 'jpg':
|
||||||
|
mtype = 'jpeg'
|
||||||
|
if mtype == 'mp3':
|
||||||
|
mtype = 'mpeg'
|
||||||
|
file_extension = mtype
|
||||||
|
if file_extension:
|
||||||
|
media_type = 'image/' + file_extension
|
||||||
|
shared_item_url = remove_html(shared_item['imageUrl'])
|
||||||
|
offer_item['attachment'].append({
|
||||||
|
'mediaType': media_type,
|
||||||
|
'name': shared_item['displayName'],
|
||||||
|
'type': 'Document',
|
||||||
|
'url': shared_item_url
|
||||||
|
})
|
||||||
|
if shared_item['itemPrice'] and shared_item['itemCurrency']:
|
||||||
|
currency_url = _currency_to_wikidata(shared_item['itemCurrency'])
|
||||||
|
offer_item['publishes']['reciprocal'] = {
|
||||||
|
"type": "Intent",
|
||||||
|
"id": share_id + '#reciprocal',
|
||||||
|
"action": "transfer",
|
||||||
|
"resourceConformsTo": currency_url,
|
||||||
|
"resourceQuantity": {
|
||||||
|
"hasUnit": "one",
|
||||||
|
"hasNumericalValue": str(shared_item['itemPrice'])
|
||||||
|
},
|
||||||
|
reciprocal_direction: shared_item['actor']
|
||||||
|
}
|
||||||
|
return offer_item
|
||||||
|
|
||||||
|
|
||||||
|
def add_shares_to_actor(base_dir: str,
|
||||||
|
nickname: str, domain: str,
|
||||||
|
actor_json: {},
|
||||||
|
max_shares_on_profile: int) -> bool:
|
||||||
|
"""Adds shared items to the given actor
|
||||||
|
"""
|
||||||
|
if 'attachment' not in actor_json:
|
||||||
|
actor_json['attachment'] = []
|
||||||
|
changed = False
|
||||||
|
|
||||||
|
# remove any existing ValueFlows items from attachment list
|
||||||
|
new_attachment = []
|
||||||
|
for attach_item in actor_json['attachment']:
|
||||||
|
is_proposal = False
|
||||||
|
if 'rel' not in attach_item:
|
||||||
|
if isinstance(attach_item['rel'], list):
|
||||||
|
if len(attach_item['rel']) == 2:
|
||||||
|
if attach_item['rel'][0] == 'payment' and \
|
||||||
|
attach_item['rel'][1].endswith('/valueflows/Proposal'):
|
||||||
|
changed = True
|
||||||
|
is_proposal = True
|
||||||
|
if not is_proposal:
|
||||||
|
new_attachment.append(attach_item)
|
||||||
|
actor_json['attachment'] = new_attachment
|
||||||
|
|
||||||
|
# do shared items exist for this account?
|
||||||
|
shares_filename = \
|
||||||
|
acct_dir(base_dir, nickname, domain) + '/shares.json'
|
||||||
|
if not os.path.isfile(shares_filename):
|
||||||
|
return changed
|
||||||
|
shares_json = load_json(shares_filename)
|
||||||
|
if not shares_json:
|
||||||
|
return changed
|
||||||
|
|
||||||
|
# add ValueFlows items to the attachment list
|
||||||
|
media_type = \
|
||||||
|
"application/ld+json; profile=" + \
|
||||||
|
"\"https://www.w3.org/ns/activitystreams\""
|
||||||
|
ctr = 0
|
||||||
|
for share_id, shared_item in shares_json.items():
|
||||||
|
if ctr >= max_shares_on_profile:
|
||||||
|
break
|
||||||
|
if not shared_item.get('onProfile'):
|
||||||
|
continue
|
||||||
|
if not shared_item.get('shareId'):
|
||||||
|
continue
|
||||||
|
share_id = _vf_share_id(shared_item['shareId'])
|
||||||
|
actor_json['attachment'].append({
|
||||||
|
"type": "Link",
|
||||||
|
"name": shared_item['displayName'],
|
||||||
|
"mediaType": media_type,
|
||||||
|
"href": share_id,
|
||||||
|
"rel": ["payment", "https://w3id.org/valueflows/Proposal"]
|
||||||
|
})
|
||||||
|
changed = True
|
||||||
|
ctr += 1
|
||||||
|
return changed
|
||||||
|
|
186
webapp_utils.py
186
webapp_utils.py
|
@ -13,7 +13,6 @@ from collections import OrderedDict
|
||||||
from session import get_json
|
from session import get_json
|
||||||
from session import get_json_valid
|
from session import get_json_valid
|
||||||
from utils import local_network_host
|
from utils import local_network_host
|
||||||
from utils import get_media_extensions
|
|
||||||
from utils import dangerous_markup
|
from utils import dangerous_markup
|
||||||
from utils import acct_handle_dir
|
from utils import acct_handle_dir
|
||||||
from utils import remove_id_ending
|
from utils import remove_id_ending
|
||||||
|
@ -43,6 +42,7 @@ from person import get_person_avatar_url
|
||||||
from posts import is_moderator
|
from posts import is_moderator
|
||||||
from blocking import is_blocked
|
from blocking import is_blocked
|
||||||
from blocking import allowed_announce
|
from blocking import allowed_announce
|
||||||
|
from shares import vf_proposal_from_share
|
||||||
|
|
||||||
|
|
||||||
def minimizing_attached_images(base_dir: str, nickname: str, domain: str,
|
def minimizing_attached_images(base_dir: str, nickname: str, domain: str,
|
||||||
|
@ -561,85 +561,6 @@ def shares_timeline_json(actor: str, page_number: int, items_per_page: int,
|
||||||
return result_json, last_page
|
return result_json, last_page
|
||||||
|
|
||||||
|
|
||||||
def _currency_to_wikidata(currency_type: str) -> str:
|
|
||||||
"""Converts a currency type, such as USD, into a wikidata reference
|
|
||||||
"""
|
|
||||||
currencies = {
|
|
||||||
"GBP": "https://www.wikidata.org/wiki/Q25224",
|
|
||||||
"EUR": "https://www.wikidata.org/wiki/Q4916",
|
|
||||||
"CAD": "https://www.wikidata.org/wiki/Q1104069",
|
|
||||||
"USD": "https://www.wikidata.org/wiki/Q4917",
|
|
||||||
"AUD": "https://www.wikidata.org/wiki/Q259502",
|
|
||||||
"PKR": "https://www.wikidata.org/wiki/Q188289",
|
|
||||||
"PEN": "https://www.wikidata.org/wiki/Q204656",
|
|
||||||
"PAB": "https://www.wikidata.org/wiki/Q210472",
|
|
||||||
"PHP": "https://www.wikidata.org/wiki/Q17193",
|
|
||||||
"RWF": "https://www.wikidata.org/wiki/Q4741",
|
|
||||||
"NZD": "https://www.wikidata.org/wiki/Q1472704",
|
|
||||||
"MXN": "https://www.wikidata.org/wiki/Q4730",
|
|
||||||
"JMD": "https://www.wikidata.org/wiki/Q209792",
|
|
||||||
"ISK": "https://www.wikidata.org/wiki/Q131473",
|
|
||||||
"EGP": "https://www.wikidata.org/wiki/Q199462",
|
|
||||||
"CNY": "https://www.wikidata.org/wiki/Q39099",
|
|
||||||
"AFN": "https://www.wikidata.org/wiki/Q199471",
|
|
||||||
"AWG": "https://www.wikidata.org/wiki/Q232270",
|
|
||||||
"AZN": "https://www.wikidata.org/wiki/Q483725",
|
|
||||||
"BYN": "https://www.wikidata.org/wiki/Q21531507",
|
|
||||||
"BZD": "https://www.wikidata.org/wiki/Q275112",
|
|
||||||
"BOB": "https://www.wikidata.org/wiki/Q200737",
|
|
||||||
"BAM": "https://www.wikidata.org/wiki/Q179620",
|
|
||||||
"BWP": "https://www.wikidata.org/wiki/Q186794",
|
|
||||||
"BGN": "https://www.wikidata.org/wiki/Q172540",
|
|
||||||
"BRL": "https://www.wikidata.org/wiki/Q173117",
|
|
||||||
"KHR": "https://www.wikidata.org/wiki/Q204737",
|
|
||||||
"UYU": "https://www.wikidata.org/wiki/Q209272",
|
|
||||||
"DOP": "https://www.wikidata.org/wiki/Q242922",
|
|
||||||
"CRC": "https://www.wikidata.org/wiki/Q242915",
|
|
||||||
"HRK": "https://www.wikidata.org/wiki/Q595634",
|
|
||||||
"CUP": "https://www.wikidata.org/wiki/Q201505",
|
|
||||||
"CZK": "https://www.wikidata.org/wiki/Q131016",
|
|
||||||
"NOK": "https://www.wikidata.org/wiki/Q132643",
|
|
||||||
"GHS": "https://www.wikidata.org/wiki/Q183530",
|
|
||||||
"GTQ": "https://www.wikidata.org/wiki/Q207396",
|
|
||||||
"HNL": "https://www.wikidata.org/wiki/Q4719",
|
|
||||||
"HUF": "https://www.wikidata.org/wiki/Q47190",
|
|
||||||
"IDR": "https://www.wikidata.org/wiki/Q41588",
|
|
||||||
"INR": "https://www.wikidata.org/wiki/Q80524",
|
|
||||||
"IRR": "https://www.wikidata.org/wiki/Q188608",
|
|
||||||
"ILS": "https://www.wikidata.org/wiki/Q131309",
|
|
||||||
"JPY": "https://www.wikidata.org/wiki/Q8146",
|
|
||||||
"KRW": "https://www.wikidata.org/wiki/Q202040",
|
|
||||||
"LAK": "https://www.wikidata.org/wiki/Q200055",
|
|
||||||
"MKD": "https://www.wikidata.org/wiki/Q177875",
|
|
||||||
"MYR": "https://www.wikidata.org/wiki/Q163712",
|
|
||||||
"MUR": "https://www.wikidata.org/wiki/Q212967",
|
|
||||||
"MNT": "https://www.wikidata.org/wiki/Q183435",
|
|
||||||
"MZN": "https://www.wikidata.org/wiki/Q200753",
|
|
||||||
"NIO": "https://www.wikidata.org/wiki/Q207312",
|
|
||||||
"NGN": "https://www.wikidata.org/wiki/Q203567",
|
|
||||||
"PYG": "https://www.wikidata.org/wiki/Q207514",
|
|
||||||
"PLN": "https://www.wikidata.org/wiki/Q123213",
|
|
||||||
"RON": "https://www.wikidata.org/wiki/Q131645",
|
|
||||||
"RUB": "https://www.wikidata.org/wiki/Q41044",
|
|
||||||
"RSD": "https://www.wikidata.org/wiki/Q172524",
|
|
||||||
"SOS": "https://www.wikidata.org/wiki/Q4603",
|
|
||||||
"ZAR": "https://www.wikidata.org/wiki/Q181907",
|
|
||||||
"CHF": "https://www.wikidata.org/wiki/Q25344",
|
|
||||||
"TWD": "https://www.wikidata.org/wiki/Q208526",
|
|
||||||
"THB": "https://www.wikidata.org/wiki/Q177882",
|
|
||||||
"TTD": "https://www.wikidata.org/wiki/Q242890",
|
|
||||||
"UAH": "https://www.wikidata.org/wiki/Q81893",
|
|
||||||
"VES": "https://www.wikidata.org/wiki/Q56349362",
|
|
||||||
"VEB": "https://www.wikidata.org/wiki/Q56349362",
|
|
||||||
"VND": "https://www.wikidata.org/wiki/Q192090"
|
|
||||||
}
|
|
||||||
currency_type = currency_type.upper()
|
|
||||||
for curr, curr_url in currencies.items():
|
|
||||||
if curr in currency_type:
|
|
||||||
return curr_url
|
|
||||||
return "https://www.wikidata.org/wiki/Q25224"
|
|
||||||
|
|
||||||
|
|
||||||
def get_shares_collection(actor: str, page_number: int, items_per_page: int,
|
def get_shares_collection(actor: str, page_number: int, items_per_page: int,
|
||||||
base_dir: str, domain: str, nickname: str,
|
base_dir: str, domain: str, nickname: str,
|
||||||
max_shares_per_account: int,
|
max_shares_per_account: int,
|
||||||
|
@ -666,106 +587,13 @@ def get_shares_collection(actor: str, page_number: int, items_per_page: int,
|
||||||
reciprocal_direction = "provider"
|
reciprocal_direction = "provider"
|
||||||
collection_name = nickname + "'s Wanted Items"
|
collection_name = nickname + "'s Wanted Items"
|
||||||
|
|
||||||
om2_link = \
|
|
||||||
"http://www.ontology-of-units-of-measure.org/resource/om-2/"
|
|
||||||
|
|
||||||
for _, shared_item in shares_json.items():
|
for _, shared_item in shares_json.items():
|
||||||
if not shared_item.get('shareId'):
|
offer_item = vf_proposal_from_share(shared_item,
|
||||||
continue
|
share_type,
|
||||||
share_id = shared_item['shareId'].replace('___', '://')
|
publishes_direction,
|
||||||
share_id = share_id.replace('--', '/')
|
reciprocal_direction)
|
||||||
offer_item = {
|
if offer_item:
|
||||||
"@context": [
|
shares_collection.append(offer_item)
|
||||||
"https://www.w3.org/ns/activitystreams",
|
|
||||||
{
|
|
||||||
"om2": om2_link,
|
|
||||||
"vf": "https://w3id.org/valueflows/",
|
|
||||||
"Proposal": "vf:Proposal",
|
|
||||||
"Intent": "vf:Intent",
|
|
||||||
"receiver": "vf:receiver",
|
|
||||||
"provider": "vf:provider",
|
|
||||||
"action": "vf:action",
|
|
||||||
"unitBased": "vf:unitBased",
|
|
||||||
"publishes": "vf:publishes",
|
|
||||||
"reciprocal": "vf:reciprocal",
|
|
||||||
"resourceClassifiedAs": "vf:resourceClassifiedAs",
|
|
||||||
"resourceConformsTo": "vf:resourceConformsTo",
|
|
||||||
"resourceQuantity": "vf:resourceQuantity",
|
|
||||||
"hasUnit": "om2:hasUnit",
|
|
||||||
"hasNumericalValue": "om2:hasNumericalValue"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"type": share_type,
|
|
||||||
"id": share_id,
|
|
||||||
"attributedTo": shared_item['actor'],
|
|
||||||
"name": shared_item['displayName'],
|
|
||||||
"content": shared_item['summary'],
|
|
||||||
"published": shared_item['published'],
|
|
||||||
"publishes": {
|
|
||||||
"type": "Intent",
|
|
||||||
"id": share_id + '#primary',
|
|
||||||
"action": "transfer",
|
|
||||||
"resourceQuantity": {
|
|
||||||
"hasUnit": "one",
|
|
||||||
"hasNumericalValue": str(shared_item['itemQty'])
|
|
||||||
},
|
|
||||||
publishes_direction: shared_item['actor']
|
|
||||||
},
|
|
||||||
"attachment": [],
|
|
||||||
"unitBased": False,
|
|
||||||
"to": "https://www.w3.org/ns/activitystreams#Public"
|
|
||||||
|
|
||||||
}
|
|
||||||
if shared_item.get('dfcId'):
|
|
||||||
offer_item['publishes']['resourceConformsTo'] = \
|
|
||||||
shared_item['dfcId']
|
|
||||||
if shared_item['category']:
|
|
||||||
offer_item['attachment'].append({
|
|
||||||
"type": "PropertyValue",
|
|
||||||
"name": "category",
|
|
||||||
"value": shared_item['category']
|
|
||||||
})
|
|
||||||
if shared_item['location']:
|
|
||||||
# pixelfed style representation of location
|
|
||||||
offer_item['location'] = {
|
|
||||||
"type": "Place",
|
|
||||||
"name": shared_item['location'].title()
|
|
||||||
}
|
|
||||||
if shared_item['imageUrl']:
|
|
||||||
if '://' in shared_item['imageUrl']:
|
|
||||||
file_extension = None
|
|
||||||
accepted_types = get_media_extensions()
|
|
||||||
for mtype in accepted_types:
|
|
||||||
if shared_item['imageUrl'].endswith('.' + mtype):
|
|
||||||
if mtype == 'jpg':
|
|
||||||
mtype = 'jpeg'
|
|
||||||
if mtype == 'mp3':
|
|
||||||
mtype = 'mpeg'
|
|
||||||
file_extension = mtype
|
|
||||||
if file_extension:
|
|
||||||
media_type = 'image/' + file_extension
|
|
||||||
shared_item_url = remove_html(shared_item['imageUrl'])
|
|
||||||
offer_item['attachment'].append({
|
|
||||||
'mediaType': media_type,
|
|
||||||
'name': shared_item['displayName'],
|
|
||||||
'type': 'Document',
|
|
||||||
'url': shared_item_url
|
|
||||||
})
|
|
||||||
if shared_item['itemPrice'] and shared_item['itemCurrency']:
|
|
||||||
currency_url = _currency_to_wikidata(shared_item['itemCurrency'])
|
|
||||||
offer_item['publishes']['reciprocal'] = {
|
|
||||||
"type": "Intent",
|
|
||||||
"id": share_id + '#reciprocal',
|
|
||||||
"action": "transfer",
|
|
||||||
"resourceConformsTo": currency_url,
|
|
||||||
"resourceQuantity": {
|
|
||||||
"hasUnit": "one",
|
|
||||||
"hasNumericalValue": str(shared_item['itemPrice'])
|
|
||||||
},
|
|
||||||
reciprocal_direction: shared_item['actor']
|
|
||||||
}
|
|
||||||
|
|
||||||
shares_collection.append(offer_item)
|
|
||||||
|
|
||||||
result_json = {
|
result_json = {
|
||||||
"@context": [
|
"@context": [
|
||||||
|
|
Loading…
Reference in New Issue