SharePoint, Power Platform Blog STRONA GŁÓWNA

Uruchamianie procesu z poziomu elementu listy SharePoint

W tym artykule pokazujemy w jaki sposób przy elemencie listy SharePoint możesz zamieścić odnośnik, który uruchamia Twój proces Power Automate. 

undefined

1. Na liście utwórz nową kolumnę, typu tekst
2. Wpisz dowolną nazwę kolumny, np. Wyślij info
3. Przejdź do Ustawień kolumny i wybierz opcję Formatuj tę kolumnę

 undefined

4. W panelu formatowania przejdź do trybu zaawansowanego i zmień zawartość pola na poniższy tekst

{
    "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
    "elmType": "button",
    "customRowAction": {
        "action": "executeFlow",
        "actionParams": "{\"id\": \"26f2326d-8df1-4df0-a2f3-ff19e73c2d98\"}"
    },
    "attributes": {
        "class": "ms-fontColor-themePrimary ms-fontColor-themeDarker--hover"
    },
    "style": {
        "border": "none",
        "background-color": "transparent",
        "cursor": "pointer"
    },
    "children": [{
        "elmType": "span",
        "attributes": {
            "iconName": "Mail"
        },
        "style": {
            "padding-right": "16px"
        }
    }]
}

5. W linii actionParams zamień na ID Twojego procesu, które znajdziesz w adresie URL na stronie procesu

undefined

 

Dodawanie użytkowników z listy do grupy SharePoint

Ręczne dodawanie użytkowników do grup SharePoint może być mozolnym zajęciem dla niektórych osób. Dużo klikania, skakania po zakładkach, głowienia się gdzie odnaleźć listę utworzonych grup. Dla użytkowników, którzy z SharePointem nie mają aż tak dużej styczności na co dzień, automatyzacja takiego procesu byłaby wybawieniem. A co jeśli wam powiem, że istnieje taka opcja w Power Automate?

Zanim przejdziemy do tematu przepływu, musimy utworzyć listę SharePoint, na którą będą dodawani użytkownicy z organizacji poprzez wypełnienie formularza.

Najważniejszym aspektem jest to, aby utworzyć w niej kolumnę o nazwie np. „Użytkownik”, której typem będzie „Osoba lub Grupa” (Person or Group). To właśnie w niej będą zawarte kluczowe dane tj. adres email, które są niezbędne do prawidłowego działania naszego procesu.

undefinedA teraz krok po kroku, przedstawię wam poniżej, jak zbudować przepływ w Power Automate, który za zadanie będzie miał dodawanie użytkowników z listy do grupy SharePoint:

  1. Zacznijmy od wyboru naszego wyzwalacza (triggera), a będzie to dokładnie „Po utworzeniu elementu” (When an item is created). W wymaganych polach wskazujemy Adres witryny oraz Nazwę listy.

    undefined
  2. Następnie dodajemy akcję, w której to właśnie będzie zachodziła cała magia, a mowa tu o akcji „Wyślij żądanie HTTP do programu SharePoint” (Send an HTTP request to SharePoint).

    Pozostało nam wypełnić nam pola, które będą kluczowe w procesie dodawania użytkowników do grupy SharePoint:

    Adres witryny – wskazujemy adres witryny, na której utworzona jest grupa, do której chcemy dodać użytkowników.

    Metoda – w tym polu z listy rozwijanej wybieramy metodę POST.

    Identyfikator URI – tutaj należy wpisać podane poniżej zapytanie, w miejscu <id> wpisujemy identyfikator grupy ID prowadzący do wybranej przez nas grupy. Unikalny numer znajduję się w adresie URL po wejściu do wybranej przez nas grupy. W naszym przypadku będzie to liczba 18.

    undefined
    /_api/web/sitegroups/getbyid(<id>)/users
    Nagłówki – tutaj musimy skupić całą swoją uwagę, aby nie popełnić błędu. Wpisujemy kolejno przedstawione wartości, znajdujące się w tabeli poniżej.

    undefined
    {

    "accept": "application/json;odata=verbose",
    "content-Type": "application/json;odata=verbose"

    }
    Treść – w tym polu również musimy zachować szczególną ostrożność i dołożyć wszelkich starań, aby nie popełnić błędu. W przypadku jego wystąpienia, niestety nasze żądanie HTTP nie zadziała, a to by była ostatnia rzecz, której chcielibyśmy doświadczyć.

    Zalecam skopiować poniższe zapytanie, w miejscu <email>, z zawartości dynamicznej wybieramy email pochodzący z kolumny typu „Osoba lub Grupa” (User or Group). W naszym przypadku będzie to Użytkownik Email.

    undefined
    {

    "__metadata": {

    "type": "SP.User"

    },

    "LoginName": "i:0#.f|membership|<email>"

    }
    undefined
    I tak o to proces budowania naszego przepływu dobiegł końca. Wspólnie dokonaliśmy automatyzacji, która ułatwi pracę niejednemu użytkownikowi, którego koszmarem są grupy SharePoint.

Jak pobrać użytkowników z grupy SharePoint po identyfikatorze ID?

Pobieranie użytkowników z grup SharePoint najczęściej wykorzystuje się w przepływach Power Automate, które mają za zadanie np. wysyłanie wiadomości email do większej ilości użytkowników bez wpisywania ich na „sztywno”. Dzięki temu wartość będzie dynamiczna, bez potrzeby ciągłej ingerencji dewelopera w przepływie oraz dokonywaniu zmian.

Najczęściej na forach internetowych znajdziemy rozwiązania, w których użytkownicy są pobierani po nazwie grupy. Teraz zastanówmy się, co w przypadku jeśli nazwa grupy zostanie zmieniona?

Już odpowiadam, przepływ zakończy swój bieg niepowodzeniem, potocznie mówiąc, wywali się. Aby uniknąć takiej sytuacji należy pobrać użytkowników z grupy nie po jej nazwie, a po identyfikatorze ID.

Sposób jak to zrobić przedstawię w poniższych krokach:

  1. Na początku potrzebujemy odnaleźć identyfikator ID danej grupy użytkowników SharePoint. Wchodzimy w grupę, a następnie zwracamy uwagę na adres URL, ponieważ to właśnie w tym miejscu zapisany jest numer ID grupy.

    undefined
  2. Przechodzimy do budowania przepływu w Power Automate. W naszym przypadku wyzwalaczem będzie Wyzwalacz ręczny. Następnie dodajemy nową akcję, w której dokładnie będzie miało miejsce pobranie użytkowników, a mowa tutaj o akcji „Wyślij żądanie HTTP do programu SharePoint” (Send an HTTP request to SharePoint).

    Wypełniamy wymagane pola:

    Adres witryny - na której leży grupa SharePoint

    Metoda – z dostępnych opcji wybieramy opcję GET

    Identyfikator URI – w tym miejscu wpisujemy podane poniżej zapytanie, w miejscu <id> wpisujemy numer ID grupy, który pozyskaliśmy w poprzednim kroku czyli 18.
    /_api/web/sitegroups/getbyid(<id>)/users
    undefined
  3. W przypadku gdy chcemy wysłać wiadomość email do pobranych użytkowników należy dodać akcję „Wybierz” (Select), która wyciągnie z poprzedniej akcji adresy email użytkowników znajdujących się w grupie SharePoint.

    Wypełniamy pola:

    Od – klikamy w puste pole, wyskoczy nam okno dynamicznej zawartości. My natomiast przechodzimy na zakładkę Wyrażenie i wpisujemy:
    body('Wyślij_Żądanie_HTTP_do_programu_SharePoint')?['d']?['results']
    Mapa – analogicznie przechodzimy do zakładki Wyrażenie i wpisujemy:
    item()?['Email']
    undefined
  4. Kolejnym krokiem jest dodanie akcji „Dołącz” (Join). Następnie należy wypełnić pola:

    Od – w tym miejscu z zawartości dynamicznej wybieramy Dane wyjściowe z akcji „Wybierz” (Select).

    Połącz przy użyciu – w tym miejscu wpisujemy średnik (;).

    undefined

  5. Naszym następnym krokiem będzie wysłanie wiadomości email do pobranych użytkowników z grupy SharePoint. Dodajemy akcję „Wyślij wiadomość e-mail (V2)”, a następnie wypełniamy pola:

    Do – z dynamicznej zawartości wybieramy opcję Dane wyjściowe z poprzedniej akcji „Dołącz” (Join).

    undefined

Jak dokonać importu danych z programu Excel na listę SharePoint?

Najczęściej spotykaną formą zapisu danych przez użytkownika jest otworzenie programu Excel oraz rozpoczęcie wypełniania arkusza. Jest to o wiele łatwiejsza forma oraz bardziej przyjazna dla osób, które z SharePointem nie miały wiele do czynienia.

Co zrobić w przypadku gdy dane zostały zapisane w arkuszu Excel, a my potrzebujemy je umieścić na liście SharePoint bez konieczności wpisywanie ich ręcznie? Na szczęście jest na to rozwiązanie, ponieważ możemy dokonać importu danych za pomocą Power Automate.

Zapytacie, jak to zrobić, jak dokonać takiego importu żeby się nie namęczyć? Już tłumaczę w poniższych punktach:

  1. Na samym początku należy wybrać Trigger (wyzwalacz), który będzie odpowiadał za uruchamianie przepływu Power Automate. W naszym przypadku będzie to umieszczenie pliku Excel w bibliotece SharePoint, czyli wybieramy wyzwalacz „Po utworzeniu pliku (tylko właściwości)”.

    Kolejno z listy rozwijanej wybieramy Adres witryny oraz Nazwę biblioteki, w której będą umieszczane arkusze Excel.

    undefined
  2. Nie chcemy, aby nasz proces importu działał statycznie, tylko na jednym określonym pliku, dlatego my zrobimy to dynamicznie. Jako kolejną akcję w przepływie wybieramy „Wyświetl listę wierszy w tabeli”, następnie wypełniamy pola: Lokalizacja, Biblioteka dokumentów, Plik, Tabela.

    I właśnie w tym momencie, w polu Plik z zawartości dynamicznej wybieramy opcję Full Path pochodzącą z naszego Triggera (wyzwalacza), aby nasz przepływ był dynamiczny i działał na każdym, nowo dodanym pliku do biblioteki dokumentów.

    Po kliknięciu opcji Wprowadź wartość niestandardową, w polu Tabela wpisujemy nazwę, którą nosi tabela w pliku Excel np. Tabela1. Od tej pory każda tabela, w każdym pliku Excel poddawanemu musi posiadać taka samą nazwę, aby proces działał poprawnie.

    undefined
  3. Teraz przyszła pora na dodanie akcji, która zapisze nam dane z pliku Excel na listę SharePoint.

    Aby wszystko miało ręce i nogi utworzymy pętlę „Zastosuj do każdego”, aby każdy element zawarty w pliku został poprawnie zapisany. W przypadku gdybyśmy nie utworzyli pętli import danych nie wykona się poprawnie.

    Jako dane wyjściowe z poprzednich kroków wybieramy z zawartości dynamicznej Value z akcji „Wyświetl listę wierszy w tabeli”.

    Następnie znajdując się w pętli dodajemy akcję „Utwórz element”. Wypełniamy wymagane pola jak Adres witryny, Nazwę listy. Pozostało nam wypełnienie kolumn listy SharePoint danymi z pliku Excel poprzez zawartość dynamiczną. Po kliknięciu w pole kolumny w akcji „Utwórz element” zostanie wyświetlone okno zawartości dynamicznych, aczkolwiek nie będzie w nim widocznych wartości kolumn z akcji „Wyświetl listę wierszy w tabeli”.

    Co należy zrobić, aby wypełnić pola kolumn listy SharePoint dynamiczną zawartością? Po kliknięciu w pole kolumny, przechodzimy do zakładki Wyrażenie i wpisujemy item()?['…'], w miejscu trzech kropek (…) wpisujemy nazwę kolumny na taką, która widnieje w tabeli w pliku Excel. Najlepiej zrobić to poprzez skopiowanie nazwy i wklejenie jej do wyrażenia w Power Automate. Analogicznie robimy tak w pozostałych kolumnach w akcji „Utwórz element”.
    item()?['...']
    undefinedundefined


Takim oto sposobem utworzyliśmy przepływ w Power Automate, którego zadaniem jest automatyzacja procesu zapisu danych z pliku Excel na listę SharePoint. Nie dość, że zostanie zaoszczędzony czas użytkownika, który miałby wypełniać dane ręcznie to i jeszcze jego nerwy nie zostaną naruszone.

Oczywiście opcjonalną opcją jest przekopiowanie danych z arkusza Excel za pomocą kombinacji przycisków CTRL + C, a następnie wklejenie ich na listę SharePoint w widoku siatki klikając CTRL + V.

Ikony dokumentów w Data View Web Part

Tworząc swój własny widok typu Data View Web Part (DVWP) być może wyświetlałeś również dokumenty z biblioteki dokumentów. Listę dokumentów łatwo jest pokazać, ale co z ikonami? We wbudowanym List View obok nazwy dokumentów widzimy ikony wyświetlane odpowiednio do rodzaju pliku. Wydaje się więc, że i w przypadku DWVP nie powinno być problemu.

undefined

Ale problem jest. We właściwościach elementów jest wyłącznie informacja o typie pliku i jego rozszerzeniu. Nie ma natomiast nic o jego ikonie. Automat więc odpada. Sprawę musimy rozwiązać ręcznie. Najpierw sprawdzimy jakie plik posiada rozszerzenie.

undefined

Od tego rozszerzenia zależy przecież ikona a ikona to przecież zwykły plik graficzny.

undefined

Na serwerze ikony są w katalogu. Możemy z nich skorzystać lub wskazać na zupełnie inne pliki, które wczesnej przygotujemy. Rodzajów plików jest niestety dużo i dla większości z nich powinniśmy przygotować odpowiedni warunek. Dodatkowo, jeżeli nie zrobimy obsługi dla jakiego typu, to powinna się przy nim jakaś ikona wyświetlić.

undefined

Na koniec jeszcze kilka poprawek w stylach, dodanie odstępów, justowanie i oto efekt naszych działań.

undefined

Formatowanie warunkowe

Jak zapewne wiecie, SharePoint Designer 2013 w ramach różnych 'usprawnień' utracił możliwość formatowania warunkowego. Nie możemy już łatwo i szybko, wykorzystując wyłącznie myszkę sprawić, żeby zadania przeterminowane miały daty podświetlone na czerwono a zadania z deadline'em na dzisiaj były podświetlone na żółto

undefined

Nie znaczy to oczywiście, że takiego formatowania nie można zrobić w inny sposób. I tak w SharePoint Designerze 2013 nie ma widoku projektowania, więc znajdujemy w kodzie miejsce, w którym mamy wyświetlaną informację, którą chcemy 'pokolorować', np zgodnie z powyższym dla terminu zadania:

<td class="ms-vb">

<xsl:value-of select="@DeadlineZadania"/> </td>

Wywnętrz znaczników <td></td> wklejamy poniższy kod. Jeżeli chcecie zmienić cały wiersz tabeli, to powyższe formatowanie należy wkleić po znaczniku <tr>

<xsl:attribute name="style">
<xsl:if test="ddwrt:FormatDateTime(string(ddwrt:Today()), 1045, 'yyyyMMdd') &gt; ddwrt:FormatDateTime(string(@DeadlineZadania), 1045, 'yyyyMMdd')">
		font-weight: bold; background-color: #DF1515; color: #000000;
</xsl:if>
<xsl:if test="ddwrt:FormatDateTime(string(ddwrt:Today()), 1045, 'yyyyMMdd') = ddwrt:FormatDateTime(string(@DeadlineZadania), 1045, 'yyyyMMdd')">
		font-weight: bold; background-color: #FAE032; color: #000000; 
</xsl:if>
</xsl:attribute>

gdzie zastosowaliśmy porównanie dat zamienionych na ciągi znaków w postaci RokMiesiącDzień (np. 20160418). więcej o formatowaniu dat znajdziecie w poprzednim wpisie na blogu: Formatowanie daty

Formatowanie daty

Ten temat znany jest chyba każdemu, kto kiedykolwiek tworzył swój formularz wyświetlania elementu listy. Ten wpis niczego nowego do dyskusji nie wnosi, ale sami tak wiele razy już sięgaliśmy do różnych źródeł w poszukiwaniu przepisu na najlepsze wyświetlanie daty, że postanowiliśmy zebrać te najbardziej oczywiste i przydatne informacje na jednym ekranie.

Pierwsza ważna informacja jest taka, że funkcje formatowania daty znajdują się w różnych namespace'ach. W przypadku formularzy SharePoint najpierw upewniamy się, że mamy odwołanie do namespace'a "ddwrt"

xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime

Teraz wyszukujemy odwołanie do naszej kolumny wyświetlającej datę

<xsl:value-of select="@NaszaData"/>

Żeby nasza data nie wyglądała tak: 2016-04-19T06:59:00Z (co i tak nie jest prawdziwą informacją bo wyświetlanie nie uwzględnia stref czasowych) tylko tak: 2016-04-18 23:59 użyjemy funkcji FormatDate

<xsl:value-of select="ddwrt:FormatDate(@NaszaData, 1045, 5)"/>

Gdzie 1045 wskazuje na LCID czyli kod wybranego języka. Ostatnia cyfra to wskazaniem jakiego formatu użyć przy wyświetlaniu daty.

I teraz najważniejsze.

Poniżej znajdziecie wykaz najczęściej stosowanych formatowań daty, gdzie kolumna LCID, oznacza kod języka. Dla formatowania po polsku potrzebujemy wstawić 1045. Jeżeli chcemy mieć formatowanie angielskie (USA), wtedy stosujemy 1033

 

Wynik formatowania LCID Format
2016-04-18 1045 1
18 kwietnia 2016 1045 3
23:59 1045 4
2016-04-18 23:59 1045 5
18 kwietnia 2016 23:59 1045 7
23:59:00 1045 12
2016-04-18 23:59:00 1045 13
18 kwietnia 2016 23:59:00 1045 15

 

Jeżeli powyższe formatowanie nie jest tym czego potrzebujesz to pora na drugi sposób z zastosowaniem funkcji FormatDateTime

<xsl:value-of select="ddwrt:FormatDateTime(string(@NaszaData) ,1045 ,'rok: yyyy MM:dd')" />

Podczas formatowania możemy dodawać różne znaki i nawet całe słowa, pamiętając że niektóre litery są zastrzeżone i o ile możemy napisać 'rok' to już nie napiszemy 'miesiąc'.

Podczas formatowania daty możemy oprócz naszego pola z datą wyświetlać i formatować datę bieżącą

<xsl:value-of select="ddwrt:FormatDateTime(string(ddwrt:Today()) ,1045 ,'yyyy-dd-MM')" />

Tabele znaków formatowania daty i godziny

Formatowanie dnia

Znak Rezultat
d Dzień miesiąca w zapisie liczbowym bez uwzględnienia znaku "0", np: 4
dd Dzień miesiąca w zapisie liczbowym z uwzględnieniem znaku "0", np: 04
ddd Skrót nazwy dnia, np: wt
dddd Pełna nazwa dnia, np: wtorek

Formatowanie miesiąca

Znak Rezultat
M Miesiąc w zapisie liczbowym bez uwzględnienia znaku "0", np: 4
MM Miesiąc w zapisie liczbowym z uwzględnieniem znaku "0", np: 04
MMM Skrót nazwy miesiąca, np: kwi
MMMM Pełna nazwa miesiąca, np: kwiecień

Formatowanie roku

Znak Rezultat
y Rok w formacie 2 liczb od 0 do 99, np. 6
yy Rok w formacie 2 liczb od 00 do 99, np. 06
yyy Rok w formacie minimum 3 liczbowym, np. rok 934
yyyy Rok w formacie 4 liczbowym, np. 2006

Formatowanie czasu

Znak Rezultat
h Wg. zegara 12 godzinnego  od 1 do 12
hh Wg. zegara 12 godzinnego  od 01 do 12
H Wg. zegara 24 godzinnego  od 1 do 24
HH Wg. zegara 24 godzinnego od 01 do 24
m Minuty od 1 do 59
mm Minuty od 01 do 59
s Sekundy od 1 do 59
ss Sekundy od 01 do 59

Widok danych z poziomu webserwisu SharePoint

Poniżej podpowiedź dla osób, które za pomocą SharePoint Designer'a potrafią podłączyć się do webserwisu w witrynie SharePoint, pobrać i wyświetlić dane, np. w jakiejś listy znajdującej się w innej witrynie SharePoint.

Jeżeli już to kiedyś robiłeś/robiłaś, to zapewne wiesz, że w prawym panelu widoku źródła danych prezentowane są otrzymane dane, np:

undefined

I może się okazać, gdy w połączeniu nie wskazałeś widoku, to w naszej źródłowej liście mamy np. kolumnę "Opis" ale w otrzymanym widoku źródła danych tej kolumny nie widzimy i nie możemy jej użyć.

Dlaczego tak się dzieje?: Bo webserwis prezentuje dane zdefiniowane w widoku domyślnym i tej kolumny w domyślnym widoku tej listy nie ma!

Rozwiązanie więc jest proste, wystarczy zmodyfikować widok, który jest widokiem domyślnym w naszej liście źródłowej, zaznaczyć potrzebną kolumnę do wyświetlenia w tym widoku.

undefined

W SharePoint Deisignerze odświeżyć źródło danych:

undefined

Znaki specjalne w treści webpartów w adresach URL

Kiedyś, jeszcze w prehistorycznym SharePoint'cie zmieniając DVWP napotkałem problem, który wydawał się być jakimś wbudowanym bugiem. Mianowicie podczas tworzenia odnośników np.

<a href="AdresURL">Tutaj tekst</a>

Designer nie przyjmował żadnych wpisów pozwalających na dodawanie wielu parametrów ze znakiem "&", w postaci np.:

/Lists/Szanse/DispForm.aspx?ID={@ID}&Source=/SitePages/MainPage.aspx

Wydawało się, że możliwy był wyłącznie zapis z jednym parametrem, czyli typu

/Lists/Szanse/DispForm.aspx?ID={@ID}

Okazało się, że rozwiązanie jest banalne i nie chodzi wcale o ilość parametrów tylko o format zapisu. Zamiast znaku "&" należy wpisać jego odpowiednie kodowanie HTML czyli "&#38;"

Trochę to mało intuicyjne, ale poniższe działa:

/Lists/Szanse/DispForm.aspx?ID={@ID}&#38;Source=/SitePages/MainPage.aspx&#38;NextParametr=Wartosc 

Jak w SharePoint'cie ukryć lewe menu

Jak ukryć w SharePoint'cie lewe menu, już chyba wszyscy wiedzą ale tak dla przypomnienia, sposobów jest kilka ale niektóre z nich są tak nieprofesjonalne, że nie warto nawet o nich pisać. Skupimy się zatem na kilku wybranych.

Ukrycie lokalnie, czyli tylko w wybranej witrynie

Jako pierwszy krok: tworzymy plik 'LeftMenu.css' i do niego wklejamy w zależności od wersji SharePoint'a poniższy kod

SharePoint 2010

<style type="text/css">
body #s4-leftpanel { display: none; } 
.s4-ca { margin-left: 0px; }
 </style>

SharePoint 2013

<style type="text/css">
#sideNavBox { display: none; }
#contentBox { margin-left:20px!important; }
</style>

 

Plik 'LeftMenu.css' zamieszczamy w dowolnej bibliotece (np. Skrypty) w witrynie, w której chcemy ukryć lewe menu.

Kopiujemy adres odnośnika, do tego pliku.

W programie SharePoint Designer otwieramy w/w witrynę i w niej przechodzimy do edycji głównego master page tej witryny (w zależności od wersji SharePoint'ta będzie to inny plik)

Przed znacznikiem kończącym </HEAD> wklejamy:

<link rel="stylesheet" type="text/css" href="[ADRES WITRYNY I BIBLIOTEKI]/LeweMenu.css"/>

Zapisujemy i sprawdzamy efekt.

 

Ukrycie globalnie, czyli dla całego zbioru witryn

W tym wypadku postępuj identycznie jak powyżej, ale:

  • działania przeprowadzamy na witrynie głównej zbioru witryn
  • po wprowadzeniu zmian w pliku master page'a, włączamy dziedziczenie tego pliku we wszystkich podwitrynach

 

Miejscowo czyli jak ukryć menu tylko na konkretnej stronie

Najpierw podobnie jak w pierwszym przypadku, tworzymy stosowny plik LeweMenu.css i zapisujemy go w wybranej przez bibliotece SharePoint. Na stronie, na której chcemy wyłączyć lewe menu, dodajemy składnik web part 'Edytor zawartości' i w edycji ustawień tego składnika webpart wpisujemy odnośnik do tego pliku.

undefined

Na koniec edytor zawartości przełączamy na 'Ukryty'.

Home ← Starsze wpisy