From d5e3d20560fdd3359b35872f4b854215f25dbd98 Mon Sep 17 00:00:00 2001 From: Christoph Dyllick-Brenzinger Date: Thu, 11 Dec 2025 14:17:38 +0100 Subject: [PATCH 01/26] partners first steps --- src/content/partners/_index.de.md | 5 ++++ src/content/partners/_index.en.md | 4 +++ .../seatable/layouts/partners/list.html | 29 +++++++++++++++++++ .../seatable/layouts/partners/single.html | 1 + 4 files changed, 39 insertions(+) create mode 100644 src/content/partners/_index.de.md create mode 100644 src/content/partners/_index.en.md create mode 100644 src/themes/seatable/layouts/partners/list.html create mode 100644 src/themes/seatable/layouts/partners/single.html diff --git a/src/content/partners/_index.de.md b/src/content/partners/_index.de.md new file mode 100644 index 000000000..3089718b9 --- /dev/null +++ b/src/content/partners/_index.de.md @@ -0,0 +1,5 @@ +--- +title: Partnerverzeichnis +description: 'adsfaf' +url: /de/partner +--- diff --git a/src/content/partners/_index.en.md b/src/content/partners/_index.en.md new file mode 100644 index 000000000..a4e69dc1e --- /dev/null +++ b/src/content/partners/_index.en.md @@ -0,0 +1,4 @@ +--- +title: Partner directory +url: /partners +--- diff --git a/src/themes/seatable/layouts/partners/list.html b/src/themes/seatable/layouts/partners/list.html new file mode 100644 index 000000000..0558418b7 --- /dev/null +++ b/src/themes/seatable/layouts/partners/list.html @@ -0,0 +1,29 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+ {{ if .Description }}

{{ .Description }}

{{ end }} +
+ +
+ + +
+
+{{ end }} diff --git a/src/themes/seatable/layouts/partners/single.html b/src/themes/seatable/layouts/partners/single.html new file mode 100644 index 000000000..715477e2a --- /dev/null +++ b/src/themes/seatable/layouts/partners/single.html @@ -0,0 +1 @@ +Detailseite eines Partners. From 1b575ac7b07585d9cfc716710657d010364a003e Mon Sep 17 00:00:00 2001 From: Christoph Dyllick-Brenzinger Date: Thu, 11 Dec 2025 15:50:03 +0100 Subject: [PATCH 02/26] first version of partner pages --- src/content/partners/upsmart/index.de.md | 5 + src/content/partners/upsmart/index.en.md | 5 + .../seatable/layouts/partners/list.html | 245 +++++++++++++++++- .../seatable/layouts/partners/single.html | 60 ++++- 4 files changed, 304 insertions(+), 11 deletions(-) create mode 100644 src/content/partners/upsmart/index.de.md create mode 100644 src/content/partners/upsmart/index.en.md diff --git a/src/content/partners/upsmart/index.de.md b/src/content/partners/upsmart/index.de.md new file mode 100644 index 000000000..f6e12255c --- /dev/null +++ b/src/content/partners/upsmart/index.de.md @@ -0,0 +1,5 @@ +--- +title: Partner Upsmart +description: 'asdfasdfasdfasdfasdfasdf' +url: /de/partner/upsmart +--- diff --git a/src/content/partners/upsmart/index.en.md b/src/content/partners/upsmart/index.en.md new file mode 100644 index 000000000..879344fd9 --- /dev/null +++ b/src/content/partners/upsmart/index.en.md @@ -0,0 +1,5 @@ +--- +title: Partner Upsmart +description: 'asdfasdfasdfasdfasdfasdf' +url: /partners/upsmart +--- diff --git a/src/themes/seatable/layouts/partners/list.html b/src/themes/seatable/layouts/partners/list.html index 0558418b7..199e7bb96 100644 --- a/src/themes/seatable/layouts/partners/list.html +++ b/src/themes/seatable/layouts/partners/list.html @@ -9,21 +9,246 @@

{{ .Title + +
+
+ + + +
+ + {{ end }} diff --git a/src/themes/seatable/layouts/partners/single.html b/src/themes/seatable/layouts/partners/single.html index 715477e2a..c10f401d2 100644 --- a/src/themes/seatable/layouts/partners/single.html +++ b/src/themes/seatable/layouts/partners/single.html @@ -1 +1,59 @@ -Detailseite eines Partners. +{{ define "main" }} +
+
+
+ + + + + + + + + + +
Back to Directory
+
+ +
+ + + + +
+

About Upsmart

+ +

+ We believe everyone should spend as much time as possible on value-adding activities. With our extensive experience, we deeply understand sales processes + and identify efficiency improvements. +

+

+ We implement Pipedrive, tailored to your sales process and integrated with existing systems. We train the team on proper usage and provide support when + needed. +

+

+ Since 2016 Upsmart has been a Pipedrive Solution Provider. We are now the largest Pipedrive Solution Provider in the Benelux and have achieved the unique + Elite Partner status. +

+
+
+
+
+{{ end }} From 88b2f5d4443e19b46a92e044cb72a20434284009 Mon Sep 17 00:00:00 2001 From: Christoph Dyllick-Brenzinger Date: Thu, 11 Dec 2025 16:23:58 +0100 Subject: [PATCH 03/26] partner single page --- .../seatable/layouts/partners/list.html | 2 +- .../seatable/layouts/partners/single.html | 67 +++++++++++++++---- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/themes/seatable/layouts/partners/list.html b/src/themes/seatable/layouts/partners/list.html index 199e7bb96..a88e1a7e7 100644 --- a/src/themes/seatable/layouts/partners/list.html +++ b/src/themes/seatable/layouts/partners/list.html @@ -129,7 +129,7 @@

Verfügbare
-
- - @@ -141,6 +215,10 @@

Upsmart

processes and identify efficiency improvements.

+
+ Solution partner + Germany +
@@ -159,6 +237,10 @@

Sales and Workflow

get to know each other in an online meeting; reach out to us!

+
+ Service partner + USA +
@@ -176,6 +258,10 @@

Dominate Sales

to use the CRM effectively. This way, Pipedrive becomes a true partner in your success.

+
+ Hosting partner + United Kingdom +
@@ -193,6 +279,10 @@

Nordic Sales Force

Nordic Sales Force: Your gateway to Scandinavia

+
+ Solution partner + Norway +
diff --git a/src/themes/seatable/layouts/partners/single.html b/src/themes/seatable/layouts/partners/single.html index 0e4803ab7..8418dbf5f 100644 --- a/src/themes/seatable/layouts/partners/single.html +++ b/src/themes/seatable/layouts/partners/single.html @@ -27,11 +27,12 @@
+ Solution partner Feature Image -
+

Upsmart

Amsterdam, Netherlands Contact @@ -40,7 +41,7 @@

Upsmart

-

Industry

+

Industry Expertise

  • Automative
  • Banking
  • @@ -49,6 +50,14 @@

    Industry

+
+

Services

+
    +
  • User training
  • +
  • Scripting
  • +
+
+

Region

    @@ -57,13 +66,23 @@

    Region

-

Sprachen

+

Language

  • Englisch
  • Deutsch
+ +
+

Contact

+
+ Max Mustermann + Managing Director + a.prinz@prozessgesteuert.de + +49 221 17735638 +
+
@@ -83,7 +102,7 @@

About Upsmart

Elite Partner status.

-

Clients

+

Former Clients

Clients

-
+

Customer References

+ ... From 8bef7d8822faf59a576537337d46d201396f5ed0 Mon Sep 17 00:00:00 2001 From: Simon Hammes Date: Fri, 12 Dec 2025 16:22:00 +0100 Subject: [PATCH 06/26] Add python script to fetch partners from SeaTable base --- update-partners.py | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 update-partners.py diff --git a/update-partners.py b/update-partners.py new file mode 100755 index 000000000..9c85b3330 --- /dev/null +++ b/update-partners.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 + +import os +import re +import unicodedata +from pathlib import Path + +import requests +import yaml + +SEATABLE_URL = 'https://cloud.seatable.io' +API_TOKEN = os.environ['PARTNERS_BASE_API_TOKEN'] +TABLE_NAME = 'Partners' +VIEW_NAME = 'seatable.com' + +SCRIPT_PATH = Path(__file__).resolve() +# Path to YML file that contains info about all partners +DATA_PATH = SCRIPT_PATH.parent.joinpath('src/data/partners.yml') +# Path to markdown files (one directory per partner) +CONTENT_PATH = SCRIPT_PATH.parent.joinpath('src/content/partners') + +def generate_base_token(api_token: str) -> tuple[str, str]: + url = f'{SEATABLE_URL}/api/v2.1/dtable/app-access-token/' + headers = { + 'Accept': 'application/json', + 'Authorization': f'Bearer {api_token}', + } + + response = requests.get(url, headers=headers) + response.raise_for_status() + body = response.json() + + return body['dtable_uuid'], body['access_token'] + + +def fetch_partners() -> list[dict]: + base_uuid, base_token = generate_base_token(API_TOKEN) + + url = f'{SEATABLE_URL}/api-gateway/api/v2/dtables/{base_uuid}/rows/' + headers = { + 'Accept': 'application/json', + 'Authorization': f'Bearer {base_token}', + } + params = { + 'table_name': TABLE_NAME, + 'view_name': VIEW_NAME, + 'convert_keys': 'true', + } + + response = requests.get(url, headers=headers, params=params) + response.raise_for_status() + body = response.json() + + return body['rows'] + +def slugify(text: str) -> str: + # Normalize Unicode characters (e.g., é -> e) + text = unicodedata.normalize('NFKD', text).encode('ascii', 'ignore').decode('ascii') + # Lowercase + text = text.lower() + # Replace non-alphanumeric characters with hyphens + text = re.sub(r'[^a-z0-9]+', '-', text) + # Remove leading/trailing hyphens + text = text.strip('-') + + return text + +def generate_frontmatter(partner: dict) -> str: + data = { + # FIXME: Add fields/do preprocessing + 'title': partner['Partner'], + 'company_name': partner['Company name'], + 'company_logo_url': partner.get('Company logo'), + } + + return '---\n' + yaml.dump(data, sort_keys=False) + '---\n' + +if __name__ == '__main__': + partners = fetch_partners() + + with open(DATA_PATH, 'w') as f: + yaml.dump(partners, f) + + for partner in partners: + key = slugify(partner['Partner']) + + directory = CONTENT_PATH.joinpath(key) + # FIXME: Filename should be based on language specified in row + file = directory.joinpath('_index.en.md') + + os.makedirs(directory, exist_ok=True) + + frontmatter = generate_frontmatter(partner) + description = partner.get('Description') or '' + with open(file, 'w') as f: + f.writelines([frontmatter, '\n', description]) From 302c98950d7a751b12a834ec66eaa60002817e98 Mon Sep 17 00:00:00 2001 From: Simon Hammes Date: Fri, 12 Dec 2025 16:25:42 +0100 Subject: [PATCH 07/26] Load data file into Alpine x-data attribute --- src/themes/seatable/layouts/partners/list.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/themes/seatable/layouts/partners/list.html b/src/themes/seatable/layouts/partners/list.html index 4f57ea33b..4621d64d2 100644 --- a/src/themes/seatable/layouts/partners/list.html +++ b/src/themes/seatable/layouts/partners/list.html @@ -5,7 +5,10 @@

{{ .Title {{ if .Description }}

{{ .Description }}

{{ end }} -
+ {{ $partners := .Site.Data.partners }} + + +