Commit b1760d41 authored by Frank Bergmann's avatar Frank Bergmann

- Update to OpenACS 5.9.1

parent 3623a2aa
......@@ -6,23 +6,23 @@
<msg key="Actions">Aktionen:</msg>
<msg key="Actions_1">Aktionen</msg>
<msg key="Add_Dup_As_New_File">Wenn Sie eine Datei mit demselben Namen hochladen, wird dem Dateinamen zur Unterscheidung ein Suffix angehängt. Bitte beachten Sie, dass es sich hierbei nicht um einen Titel für die Datei handelt. Diesen können Sie beliebig wählen. Der Dateiname hingegen muß immer eindeutig sein.</msg>
<msg key="Add_Dup_As_Revision">Wenn Sie eine Datei mit dem selben Namen einer bereits existierenden Datei hochladen, dann wird dieses zu einer neuen Revision der existierenden Datei.</msg>
<msg key="Add_Dup_As_Revision">Wenn Sie eine Datei mit einem Namen hochladen, der bereits in diesem Ordner existiert, wird eine neue Revision der vorhandenen Datei hinzugefügt.</msg>
<msg key="Add_File">Datei hochladen</msg>
<msg key="Add_folder_from_fs">Neue Order von Dateisystem</msg>
<msg key="Add_folder_from_fs">Ordner aus dem Dateiablage hinzufügen</msg>
<msg key="Add_pretty_name">%pretty_name% hinzufügen</msg>
<msg key="Add_Revision">Neue Revision</msg>
<msg key="Add_Revision">Revision hinzufügen</msg>
<msg key="Author">Autor</msg>
<msg key="back_to_folder_view">Zurück zur Verzeichnisübersicht</msg>
<msg key="back_to_project">Zurück zum Projekt</msg>
<msg key="bytes">Bytes</msg>
<msg key="Categories">Categorien</msg>
<msg key="Categories">Kategorien</msg>
<msg key="Change_Name">Umbenennen</msg>
<msg key="Change_upload_limit">Veränderung des Dateilimits</msg>
<msg key="Choose_Destination_Folder">Wählen Sie ein Zielverzeichnis aus</msg>
<msg key="Configure_File_Upload_Limit">Konfigurieren des Dateilimits</msg>
<msg key="Copy">Kopieren</msg>
<msg key="Copy_File">Datei kopieren</msg>
<msg key="Copy_to_folder_title">Nach Ordner kopieren</msg>
<msg key="Copy_to_folder_title">In Ordner kopieren</msg>
<msg key="Create">Erstellen</msg>
<msg key="Create_a_new_folder">Neuen Ordner erstellen
</msg>
......@@ -39,8 +39,8 @@
<msg key="Delete_Version">Version löschen</msg>
<msg key="Description">Kommentar:</msg>
<msg key="Download">Herunterladen</msg>
<msg key="Download_ZIP">Als ZIP herunterladen</msg>
<msg key="Download_ZIP_Checked_Items">Angewählte Elemente als ZIP herunterladen</msg>
<msg key="Download_ZIP">Als ZIP-Datei herunterladen</msg>
<msg key="Download_ZIP_Checked_Items">Markierte Elemente als ZIP-Datei herunterladen</msg>
<msg key="Edit">Bearbeiten</msg>
<msg key="edit">Umbenennen</msg>
<msg key="Edit_File">Datei bearbeiten</msg>
......@@ -57,7 +57,7 @@
<msg key="file_page_owner_label">Besitzer: %owner%</msg>
<msg key="Folder">Ordner</msg>
<msg key="folder">Ordner</msg>
<msg key="Folder_Add">Neuer Ordner</msg>
<msg key="Folder_Add">Ordner hinzufügen</msg>
<msg key="Folder_available_via_WebDAV_at">Dieser Ordner ist via WebDAV verfügbar unter %webdav_url%</msg>
<msg key="folder_delete_page_title">&#34;%folder_name%&#34; löschen</msg>
<msg key="Folder_deleted">Verzeichnis gelöscht</msg>
......@@ -74,7 +74,7 @@
<msg key="last_week">Letzte Woche</msg>
<msg key="link">Link</msg>
<msg key="lt_Add_a_link_to_a_web_p">Einen Link auf eine Internetseite in diesem Ordner anlegen</msg>
<msg key="lt_administer_permission">Admin Zugriffsberechtigungen</msg>
<msg key="lt_administer_permission">Zugriffsberechtigungen verwalten</msg>
<msg key="lt_All_Versions_of_title">Alle Versionen von &#34;%title%&#34;</msg>
<msg key="lt_Are_you_sure_that_you">Wollen Sie die Version &#34;%version_name%&#34; von &#34;%title%&#34; unwiderruflich löschen?</msg>
<msg key="lt_bad_folder_id_folder_">Fehlende Ordner-ID</msg>
......@@ -145,12 +145,12 @@
<msg key="New_URL_Uploaded">Neue URL ist hochgeladen</msg>
<msg key="No_such_type">Typ nicht vorhanden</msg>
<msg key="no_such_URL">URL nicht gefunden</msg>
<msg key="No_valid_destination_folders_exist">Kein gültiger Zielordner</msg>
<msg key="Not_Allowed">Nicht erlaubt</msg>
<msg key="No_valid_destination_folders_exist">Kein gültiger Zielordner vorhanden</msg>
<msg key="Not_Allowed">Nicht berechtigt</msg>
<msg key="PDF">PDF</msg>
<msg key="Permissions">Berechtigungen</msg>
<msg key="Please_select_at_least_one_item_to_copy.">Bitte wählen Sie mindested ein Element an.</msg>
<msg key="pretty_name">Dateisystem</msg>
<msg key="Please_select_at_least_one_item_to_copy.">Bitte wählen Sie mindestens ein zu kopierendes Element</msg>
<msg key="pretty_name">Dateiablage</msg>
<msg key="properties">Eigenschaften</msg>
<msg key="Rename">Umbenennen</msg>
<msg key="Rename_File">Datei umbenennen</msg>
......@@ -159,23 +159,27 @@
<msg key="Search">Suchen</msg>
<msg key="Search_again">Erneut suchen:</msg>
<msg key="Search_Results">Suchergebnisse</msg>
<msg key="Selected_items_have_been_copied">Ausgewählte Dateien wurden kopiert.</msg>
<msg key="Selected_items_have_been_moved">Ausgewählte Dateien wurden verschoben.</msg>
<msg key="Set_Permissions">Berechtigungen erteilen</msg>
<msg key="show_all_versions">Alle Versionen anzeigen</msg>
<msg key="show_version_title">Zeige %version.title%</msg>
<msg key="show_version_title">%version.title% anzeigen</msg>
<msg key="simple_add_page_title">%pretty_name% erstellen</msg>
<msg key="Size">Größe</msg>
<msg key="Size_bytes">Größe (Bytes)</msg>
<msg key="There_was_a_problem_copying_the_following_items">Beim Kopieren der folgenden Dateien ist ein Fehler aufgetreten</msg>
<msg key="There_was_a_problem_moving_the_following_items">Es gab ein Problem beim Verschieben der folgenden Dateien</msg>
<msg key="this_may_take_a_while">&lt;strong&gt;Hinweis:&lt;/strong&gt; Dieser Vorgang kann einige Minuten dauern. </msg>
<msg key="Title">Name:</msg>
<msg key="Title_">Name:</msg>
<msg key="Type">Typ</msg>
<msg key="untitled">Ohne Angabe</msg>
<msg key="Update">Hochladen</msg>
<msg key="Update">Aktualisieren</msg>
<msg key="Upload">Hochladen</msg>
<msg key="Upload_a_file">Neue Datei hochladen</msg>
<msg key="Upload_a_folder">Ordner hochladen</msg>
<msg key="Upload_a_new_version">Neue Version hochladen</msg>
<msg key="Upload_folder_help">Ordner aus Dateisystem hochladen</msg>
<msg key="Upload_folder_help">Einen Ordner aus dem Dateiablage hochladen</msg>
<msg key="Upload_Limit">Größenbeschränkung (Bytes)</msg>
<msg key="Upload_limit_error">Die Dateigrößenbeschränkung darf nicht höher liegen als</msg>
<msg key="Upload_limit_error_2">Bytes. Bitte erhöhen Sie die Größenbeschränkung in der Tcl Konfigurations Datei Ihres AOLserver.</msg>
......@@ -193,7 +197,7 @@
<msg key="Version_filename_1">Dateiname der Version:</msg>
<msg key="Version_Notes">Kommentar zur Version</msg>
<msg key="Version_Notes_1">Kommentar zur Version:</msg>
<msg key="view_contents">Inhalt ansehen</msg>
<msg key="view_contents">Inhalte anzeigen</msg>
<msg key="view_details">Details anzeigen</msg>
<msg key="Yes_Delete">Ja, löschen.</msg>
<msg key="Yes_Delete_It">Ja, löschen</msg>
......
This diff is collapsed.
......@@ -6,6 +6,7 @@
<msg key="Actions">Opciones:</msg>
<msg key="Actions_1">Opciones</msg>
<msg key="Add_Dup_As_New_File">Si sube un documento con el mismo nombre que otro documento ya existente en esta carpeta, se aadir al nombre de su documento un sufijo incremental (p.e. &#34;mydoc.doc&#34; -&amp;gt; &#34;mydoc-1.doc&#34;). Notese que el ttulo del documento no ser cambiado. Es el nombre de documento el que debe ser nico en cada carpeta.</msg>
<msg key="Add_Dup_As_Revision">Si carga un archivo con el mismo nombre que un archivo que ya est en esta carpeta, se agregar como una nueva revisin del archivo existente.</msg>
<msg key="Add_File">Aadir archivo</msg>
<msg key="Add_folder_from_fs">Aadir una carpeta desde sistema de ficheros</msg>
<msg key="Add_pretty_name">Aadir %pretty_name%</msg>
......@@ -144,6 +145,7 @@
<msg key="No_such_type">Tipo no encontrado</msg>
<msg key="no_such_URL">URL no encontrada</msg>
<msg key="No_valid_destination_folders_exist">Ninguna carpeta destino vlida</msg>
<msg key="Not_Allowed">No permitido</msg>
<msg key="PDF">PDF</msg>
<msg key="Permissions">Permisos</msg>
<msg key="Please_select_at_least_one_item_to_copy.">Por favor, selecciona un archivo para copiar.</msg>
......@@ -156,12 +158,16 @@
<msg key="Search">Buscar</msg>
<msg key="Search_again">Buscar de nuevo:</msg>
<msg key="Search_Results">Resultados de bsqueda</msg>
<msg key="Selected_items_have_been_copied">Los archivos seleccionados han sido copiados.</msg>
<msg key="Selected_items_have_been_moved">Los archivos seleccionados han sido movidos.</msg>
<msg key="Set_Permissions">Establecer Permisos</msg>
<msg key="show_all_versions">mostrar todas las versiones</msg>
<msg key="show_version_title">Mostrar %version.title%</msg>
<msg key="simple_add_page_title">Crear %pretty_name%</msg>
<msg key="Size">Tamao</msg>
<msg key="Size_bytes">Tamao (bytes)</msg>
<msg key="There_was_a_problem_copying_the_following_items">Ha habido un problema copiando los siguientes archivos</msg>
<msg key="There_was_a_problem_moving_the_following_items">Ha habido un problema moviendo los siguientes archivos</msg>
<msg key="this_may_take_a_while">&lt;strong&gt;Nota:&lt;/strong&gt; Esta operacin puede tardar, por favor, sea paciente.</msg>
<msg key="Title">Ttulo</msg>
<msg key="Title_">Ttulo :</msg>
......
......@@ -33,13 +33,13 @@
<msg key="items">kpl</msg>
<msg key="Last_Modified">Muokattu</msg>
<msg key="lt_administer_permission">muokkaa käyttöoikeuksia</msg>
<msg key="lt_Are_you_sure_that_you">Haluatko varmasti tuhota version &#34;%version_name%&#34; tiedostosta &#34;%title%&#34;? Toimintoa ei voi perua.</msg>
<msg key="lt_Are_you_sure_that_you">Haluatko varmasti tuhota version &quot;%version_name%&quot; tiedostosta &quot;%title%&quot;? Toimintoa ei voi perua.</msg>
<msg key="lt_bad_folder_id_folder_">kansion id puuttuu</msg>
<msg key="lt_delete_file">Haluatko todellakin poistaa kaikki tiedoston &#34;%title%&#34; versiot? Toimintoa ei voi peruuttaa.</msg>
<msg key="lt_delete_folder">Haluatko varmasti poistaa kansion &#34;%folder_name%&#34; ja kaikki sen sisältämät kohteet? Toimintoa ei voi perua.</msg>
<msg key="lt_delete_file">Haluatko todellakin poistaa kaikki tiedoston &quot;%title%&quot; versiot? Toimintoa ei voi peruuttaa.</msg>
<msg key="lt_delete_folder">Haluatko varmasti poistaa kansion &quot;%folder_name%&quot; ja kaikki sen sisältämät kohteet? Toimintoa ei voi perua.</msg>
<msg key="lt_Delete_this_file_incl">Poista tiedosto (mukaanlukien kaikki sen versiot)</msg>
<msg key="lt_Download_an_archive_o">Imuroi tämän kansion sisältö pakattuna tiedostona</msg>
<msg key="lt_Either_there_is_alrea">Joko kansio nimeltä &#34;%folder_name%&#34; on jo olemassa, tai painoit lähetä-nappulaa useammin kuin kerran. Voit palata takaisin selaimesi back-napilla ja antaa kansiolle uuden nimen, tai &lt;a href=&#34;%directory_url%&#34;&gt;palata hakemiston sisältösivulle&lt;/a&gt; katsomaan, löytyykö kansiosi sieltä.</msg>
<msg key="lt_Either_there_is_alrea">Joko kansio nimeltä &quot;%folder_name%&quot; on jo olemassa, tai painoit lähetä-nappulaa useammin kuin kerran. Voit palata takaisin selaimesi back-napilla ja antaa kansiolle uuden nimen, tai &lt;a href=&quot;%directory_url%&quot;&gt;palata hakemiston sisältösivulle&lt;/a&gt; katsomaan, löytyykö kansiosi sieltä.</msg>
<msg key="lt_Folder_folder_name_is">Kansio %folder_name% on tyhjä.</msg>
<msg key="lt_It_appears_that_there">Vaikuttaa siltä, että kansiossa on jo samanniminen tiedosto (tosin on myös mahdollista, että painoit lähetä-nappulaa useammin kuin kerran).</msg>
<msg key="lt_Modify_permissions_on">Muokkaa tiedoston käyttöoikeuksia</msg>
......@@ -55,7 +55,7 @@
<msg key="lt_There_are_no_versions">Tästä tiedostosta ei ole yhtään versiota, johon sinulla olisi oikeudet</msg>
<msg key="lt_This_file_has_version">Tästä tiedostosta on versioita, joihin sinulla ei ole poisto-oikeutta. Tämän takia et pysty poistamaan tiedostoa.</msg>
<msg key="lt_This_folder_contains_">Kansiossa on tiedostoja, joihin sinulla ei ole poisto-oikeutta, joten et voi poistaa kansiota.</msg>
<msg key="lt_Use_the_Browse_button">Paina &#34;Browse&#34;-nappulaa etsiäksesi tiedoston koneeltasi, ja paina sitten &#34;Open&#34;.</msg>
<msg key="lt_Use_the_Browse_button">Paina &quot;Browse&quot;-nappulaa etsiäksesi tiedoston koneeltasi, ja paina sitten &quot;Open&quot;.</msg>
<msg key="lt_version_not_valid">Määritelty versio on virheellinen.</msg>
<msg key="lt_We_got_an_error_that_">Tapahtui virhe, jonka syytä emme pysty tunnistamaan. Lähetäthän tiedon asiasta järjestelmän ylläpitäjälle.</msg>
<msg key="lt_We_received_an_error_">Tapahtui tietokantavirhe. Valitsemasi kansio luultavasti sisältää jo samannimisen tiedoston.</msg>
......
This diff is collapsed.
This diff is collapsed.
......@@ -56,23 +56,23 @@
<msg key="last_week">Siste uke</msg>
<msg key="link">lenke</msg>
<msg key="lt_administer_permission">administrer tillatelser</msg>
<msg key="lt_All_Versions_of_title">Alle versjoner av &#34;%title%&#34; </msg>
<msg key="lt_Are_you_sure_that_you">Er du sikker på at du vil slette denne versjonen &#34;%version_name%&#34; av &#34;%title%&#34;? Dette kan du ikke gå tilbake på siden. </msg>
<msg key="lt_All_Versions_of_title">Alle versjoner av &quot;%title%&quot; </msg>
<msg key="lt_Are_you_sure_that_you">Er du sikker på at du vil slette denne versjonen &quot;%version_name%&quot; av &quot;%title%&quot;? Dette kan du ikke gå tilbake på siden. </msg>
<msg key="lt_bad_folder_id_folder_">manglende mappe-ID</msg>
<msg key="lt_Comments_on_this_file">Kommentarer til denne filen:</msg>
<msg key="lt_contentscontent_size_">%contents.content_size_pretty% bytes </msg>
<msg key="lt_delete_file">Er du sikker på at di vil slette filen &#34;%title%&#34; og alle versjonene av den? Denne ordren kan ikke omgjøres.</msg>
<msg key="lt_delete_folder">Er du sikker på at di vil slette mappen &#34;%folder_name%&#34; og alle innleggene den inneholder? Denne ordren kan ikke omgjøres.</msg>
<msg key="lt_delete_file">Er du sikker på at di vil slette filen &quot;%title%&quot; og alle versjonene av den? Denne ordren kan ikke omgjøres.</msg>
<msg key="lt_delete_folder">Er du sikker på at di vil slette mappen &quot;%folder_name%&quot; og alle innleggene den inneholder? Denne ordren kan ikke omgjøres.</msg>
<msg key="lt_Delete_this_file_incl">Slett denne filen (med alle versjoner)</msg>
<msg key="lt_Do_you_want_to_delete">Ønsker du å slette innleggene på listen?</msg>
<msg key="lt_Download_an_archive_o">Last ned et arkiv av innholdet i denne mappen</msg>
<msg key="lt_Either_there_is_alrea">Enten er det allerede en mappe som heter &#34;%folder_name%&#34; eller så har du klikket på knappen mer enn en gang. Du kan bruke Tilbake-knappen for å gå tilbake og velge et nytt navn eller &lt;a href=&#34;%directory_url%&#34;&gt;gå tilbake til innholdlisten&lt;/a&gt; for å se om mappen din er der.</msg>
<msg key="lt_Either_there_is_alrea">Enten er det allerede en mappe som heter &quot;%folder_name%&quot; eller så har du klikket på knappen mer enn en gang. Du kan bruke Tilbake-knappen for å gå tilbake og velge et nytt navn eller &lt;a href=&quot;%directory_url%&quot;&gt;gå tilbake til innholdlisten&lt;/a&gt; for å se om mappen din er der.</msg>
<msg key="lt_File-Storage_folder_f">Fillagermappe: %folder_name%\n</msg>
<msg key="lt_File_Storage_Notifica">Fillager melding</msg>
<msg key="lt_Folder_folder_name_is">Mappen %folder_name% er tom. </msg>
<msg key="lt_It_appears_that_there">Det virker som om det allerede er en fil med dette navnet i denne mappen (eller kanskje har du klikket mer enn en gang på send-knappen.)</msg>
<msg key="lt_Leave_blank_for_linked_documents">La tittelfeltet stå tomt når du laster opp flere dokumenter som refererer til hverandre.</msg>
<msg key="lt_Live_version_of_title">Aktiv versjon av &#34;%title%&#34;</msg>
<msg key="lt_Live_version_of_title">Aktiv versjon av &quot;%title%&quot;</msg>
<msg key="lt_Modify_permissions_on">Rediger tilgang til denne filen</msg>
<msg key="lt_Modify_permissions_on_1">Rediger tilgang til denne mappen</msg>
<msg key="lt_Moving_allowed_count_">Flytter %allowed_count% innlegg.</msg>
......@@ -83,8 +83,8 @@
<msg key="lt_not_allowed_count_ite">%not_allowed_count% innlegg kan ikke slettes</msg>
<msg key="lt_Notification_for_File">Melding for: Fillager: %action_type%\n</msg>
<msg key="lt_Please_enter_the_new_">Vennligst skriv det nye navnet på denne filen:</msg>
<msg key="lt_Select_the_folder_tha">Velg mappen som du ønsker å kopiere &#34;%file_name%&#34; til</msg>
<msg key="lt_Select_the_folder_tha_1">Velg mappen som du ønsker å flytte &#34;%file_name%&#34; under</msg>
<msg key="lt_Select_the_folder_tha">Velg mappen som du ønsker å kopiere &quot;%file_name%&quot; til</msg>
<msg key="lt_Select_the_folder_tha_1">Velg mappen som du ønsker å flytte &quot;%file_name%&quot; under</msg>
<msg key="lt_Show_files_modified_i">Vis filer endret de siste</msg>
<msg key="lt_show_only_live_versio">vis bare aktiv versjon</msg>
<msg key="lt_The_folder_link_you_s">Mappen %folder_link% du har valgt har allerede en fil med samme navn.</msg>
......@@ -96,7 +96,7 @@
<msg key="lt_This_file_has_version">Denne filen har versjoner som du ikke har tillatelse til å slette, så du kan ikke slette denne filen.</msg>
<msg key="lt_This_folder_contains_">Denne mappen inneholder innlegg som du ikke har tillatelse til å slette, derfor kan du ikke slette den.</msg>
<msg key="lt_This_is_a_ZIP">Denne ZIP-filen inneholder flere filer</msg>
<msg key="lt_Use_the_Browse_button">Bruk &#34;Browse...&#34; knappen for å finne filen din, og klikk &#34;Last opp&#34;.</msg>
<msg key="lt_Use_the_Browse_button">Bruk &quot;Browse...&quot; knappen for å finne filen din, og klikk &quot;Last opp&quot;.</msg>
<msg key="lt_version_not_valid">Den angitte versjonen er ikke gyldig.</msg>
<msg key="lt_Version_Notes_descrip">Versjonskommentar: %description%\n</msg>
<msg key="lt_View_folder_contents_">Se innhold i mappe: %url_version% \n\n</msg>
......@@ -107,8 +107,8 @@
<msg key="lt_You_probably_clicked_">Du har sannlynligvis klikket på Legg til-knappen mer enn en gang. Sjekk om filen er korrekt innlagt i %folder_link% du ønsker, eller du kan bruke Tilbake-knappen for å gå tilbake og legge inn versjonsfilen på nytt.</msg>
<msg key="lt_Your_file_is_larger_t">Filen din er større enn maksimum filstørrelse som er tillatt på dette systemet (%number_of_bytes% bytes) </msg>
<msg key="lt_Your_file_is_larger_t_1">Filen din er større enn maksimum filstørrelse som er tillatt på dette systemet (%max_number_of_bytes% bytes) </msg>
<msg key="lt_Your_search_on_query_">Søket ditt på &#34;%query%&#34; gav ingen resultater.</msg>
<msg key="lt_Your_search_on_query__1">Søket ditt på &#34;%query%&#34; gav følgende filer:</msg>
<msg key="lt_Your_search_on_query_">Søket ditt på &quot;%query%&quot; gav ingen resultater.</msg>
<msg key="lt_Your_search_on_query__1">Søket ditt på &quot;%query%&quot; gav følgende filer:</msg>
<msg key="Modified">Endret</msg>
<msg key="Move">Flytt</msg>
<msg key="Move_File">Flytt fil</msg>
......
This diff is collapsed.
......@@ -60,24 +60,24 @@
<msg key="link">link</msg>
<msg key="lt_Add_a_link_to_a_web_p">Adicionar um link para uma pgina nesta pasta</msg>
<msg key="lt_administer_permission">permisses administrativas</msg>
<msg key="lt_All_Versions_of_title">Todas as verses de &#34;%title%&#34;</msg>
<msg key="lt_Are_you_sure_that_you">Voc tem certeza que deseja remover &#34;%version_name%&#34; de &#34;%title%&#34;? Esta ao irreversvel.</msg>
<msg key="lt_All_Versions_of_title">Todas as verses de &quot;%title%&quot;</msg>
<msg key="lt_Are_you_sure_that_you">Voc tem certeza que deseja remover &quot;%version_name%&quot; de &quot;%title%&quot;? Esta ao irreversvel.</msg>
<msg key="lt_bad_folder_id_folder_">faltando id da pasta</msg>
<msg key="lt_Comments_on_this_file">Comentrios sobre este arquivo</msg>
<msg key="lt_contentscontent_size_">%contents.content_size_pretty% bytes</msg>
<msg key="lt_Copy_Checked_Items_to">Copiar Itens Marcados para Outra Pasta</msg>
<msg key="lt_delete_file">Voc tem certeza que quer remover o arquivo &#34;%title%&#34; e todas suas verses? Esta ao irreversvel.</msg>
<msg key="lt_delete_folder">Voc tem certeza que quer remover a pasta &#34;%folder_name%&#34; e todos os itens que ela contm? Esta ao irreversvel.</msg>
<msg key="lt_delete_file">Voc tem certeza que quer remover o arquivo &quot;%title%&quot; e todas suas verses? Esta ao irreversvel.</msg>
<msg key="lt_delete_folder">Voc tem certeza que quer remover a pasta &quot;%folder_name%&quot; e todos os itens que ela contm? Esta ao irreversvel.</msg>
<msg key="lt_Delete_this_file_incl">Remover este arquivo (incluindo todas as verses)</msg>
<msg key="lt_Do_you_want_to_delete">Deseja excluir os itens listados?</msg>
<msg key="lt_Download_an_archive_o">Baixar um arquivo com o contedo desta pasta</msg>
<msg key="lt_Either_there_is_alrea">J existe uma pasta com o nome &#34;%folder_name%&#34; ou voc clicou no boto mais do que uma vez. Voc pode usar o boto Voltar para retornar e escolher um novo nome, ou &lt;a href=&#34;%directory_url%&#34;&gt;retorne a lista de diretrios&lt;/a&gt; para ver se sua pasta est l.</msg>
<msg key="lt_Either_there_is_alrea">J existe uma pasta com o nome &quot;%folder_name%&quot; ou voc clicou no boto mais do que uma vez. Voc pode usar o boto Voltar para retornar e escolher um novo nome, ou &lt;a href=&quot;%directory_url%&quot;&gt;retorne a lista de diretrios&lt;/a&gt; para ver se sua pasta est l.</msg>
<msg key="lt_File-Storage_folder_f">Pasta do Armazenamento de Arquivos: %folder_name%\n</msg>
<msg key="lt_File_Storage_Notifica">Notificao do Armazenamento de Arquivos</msg>
<msg key="lt_Folder_folder_name_is">Pasta %folder_name% est vazia.</msg>
<msg key="lt_It_appears_that_there">Parece que j existe um arquivo com aquele nome nesta pasta (embora possivelmente voc clicou mais que uma vez no boto submeter.)</msg>
<msg key="lt_Leave_blank_for_linked_documents">Deixo o ttulo em branco quando enviar um pacote de arquivos.</msg>
<msg key="lt_Live_version_of_title">Verso ativa de &#34;%title%&#34;</msg>
<msg key="lt_Live_version_of_title">Verso ativa de &quot;%title%&quot;</msg>
<msg key="lt_Modify_permissions_on">Modificar permisses neste arquivo</msg>
<msg key="lt_Modify_permissions_on_1">Modificar permisses nesta pasta</msg>
<msg key="lt_Move_Checked_Items_to">Mover Itens Marcados para Outra Pgina</msg>
......@@ -89,8 +89,8 @@
<msg key="lt_not_allowed_count_ite">%not_allowed_count% itens no podem ser movidos</msg>
<msg key="lt_Notification_for_File">Notificao para: Armazenagem de Arquivo: %action_type%\n</msg>
<msg key="lt_Please_enter_the_new_">Por favor digite o novo nome para este arquivo:</msg>
<msg key="lt_Select_the_folder_tha">Selecione a pasta de destino da cpia de &#34;%file_name%&#34;</msg>
<msg key="lt_Select_the_folder_tha_1">Selecione a pasta de destino de &#34;%file_name%&#34;</msg>
<msg key="lt_Select_the_folder_tha">Selecione a pasta de destino da cpia de &quot;%file_name%&quot;</msg>
<msg key="lt_Select_the_folder_tha_1">Selecione a pasta de destino de &quot;%file_name%&quot;</msg>
<msg key="lt_Show_files_modified_i">Mostrar arquivos modificados nos ltimos</msg>
<msg key="lt_show_only_live_versio">mostrar somente verso ativa</msg>
<msg key="lt_The_folder_link_you_s">O %folder_link% que voc selecionou j contm um arquivo com o mesmo nome.</msg>
......@@ -105,7 +105,7 @@
<msg key="lt_Upload_a_compressed_f">Enviar uma pasta compactada que ser descompactada do jeito que era.</msg>
<msg key="lt_Upload_a_file_in_this">Enviar um arquivo para esta pasta</msg>
<msg key="lt_Upload_compressed_fol">Enviar Pasta Compactada</msg>
<msg key="lt_Use_the_Browse_button">Use o boto &#34;Navegar...&#34; para localizar seu arquivo, depois ento clique &#34;Abrir&#34;.</msg>
<msg key="lt_Use_the_Browse_button">Use o boto &quot;Navegar...&quot; para localizar seu arquivo, depois ento clique &quot;Abrir&quot;.</msg>
<msg key="lt_version_not_valid">A verso especificada invlida.</msg>
<msg key="lt_Version_Notes_descrip">Notas da Verso: %description%\n </msg>
<msg key="lt_View_folder_contents_">Ver contedo da pasta: %url_version% \n\n</msg>
......@@ -116,8 +116,8 @@
<msg key="lt_You_probably_clicked_">Voc provavelmente clicou no boto Adicionar mais do que um vez. Verifique se o arquivo est propriamente carregado na %folder_link% que voc quer, ou voc pode usar o boto Back para retornar e redigitar a verso do arquivo.</msg>
<msg key="lt_Your_file_is_larger_t">Seu arquivo maior que o tamanho mximo do arquivo permitido neste sistema (%number_of_bytes% bytes)</msg>
<msg key="lt_Your_file_is_larger_t_1">Seu arquivo maior que o tamanho mximo de arquivos permitido neste sistema (%max_number_of_bytes% bytes)</msg>
<msg key="lt_Your_search_on_query_">Sua procura por &#34;%query%&#34; no retornou nenhum resultado.</msg>
<msg key="lt_Your_search_on_query__1">Sua procura por &#34;%query%&#34; retornou os seguintes arquivos:</msg>
<msg key="lt_Your_search_on_query_">Sua procura por &quot;%query%&quot; no retornou nenhum resultado.</msg>
<msg key="lt_Your_search_on_query__1">Sua procura por &quot;%query%&quot; retornou os seguintes arquivos:</msg>
<msg key="Modified">Modificado</msg>
<msg key="Move">Mover</msg>
<msg key="Move_File">Mover Arquivo</msg>
......
......@@ -74,24 +74,24 @@
<msg key="link">ссылка</msg>
<msg key="lt_Add_a_link_to_a_web_p">Добавить ссылку на веб страницу в эту папку</msg>
<msg key="lt_administer_permission">права администратора</msg>
<msg key="lt_All_Versions_of_title">Все Версии&#34;%title%&#34;</msg>
<msg key="lt_Are_you_sure_that_you">Вы действительно хотите удалить эту версию&#34;%version_name%&#34; &#34;%title%&#34;? Данное действие не может быть отменено.</msg>
<msg key="lt_All_Versions_of_title">Все Версии&quot;%title%&quot;</msg>
<msg key="lt_Are_you_sure_that_you">Вы действительно хотите удалить эту версию&quot;%version_name%&quot; &quot;%title%&quot;? Данное действие не может быть отменено.</msg>
<msg key="lt_bad_folder_id_folder_">отсутствует идентификатор папки</msg>
<msg key="lt_Comments_on_this_file">Комментарии к данному файлу:</msg>
<msg key="lt_contentscontent_size_">%contents.content_size_pretty% байтов</msg>
<msg key="lt_Copy_Checked_Items_to">Скопировать выбранные позиции в другую папку</msg>
<msg key="lt_delete_file">Вы действительно хотите удалить файл&#34;%title%&#34; и все его версии? Данное действие не может быть отменено.</msg>
<msg key="lt_delete_folder">Вы действительно хотите удалить папку&#34;%folder_name%&#34; и все ее содержимое? Данное действие не может быть отменено.</msg>
<msg key="lt_delete_file">Вы действительно хотите удалить файл&quot;%title%&quot; и все его версии? Данное действие не может быть отменено.</msg>
<msg key="lt_delete_folder">Вы действительно хотите удалить папку&quot;%folder_name%&quot; и все ее содержимое? Данное действие не может быть отменено.</msg>
<msg key="lt_Delete_this_file_incl">Удалить этот файл (включая все версии)</msg>
<msg key="lt_Do_you_want_to_delete">Вы действительно хотите удалить перечисленные пункты?</msg>
<msg key="lt_Download_an_archive_o">Скачать архив содержимого данной папки</msg>
<msg key="lt_Either_there_is_alrea">Папка с именем &#34;%folder_name%&#34; уже существует либо вы нажали на кнопку более одного раза.Вы можете воспользоваться кнопкой Назад, чтобы вернуться и выбрать новое имя, или &lt;a href=&#34;%directory_url%&#34;&gt;вернуться к списку директорий&lt;/a&gt; чтобы проверить, есть ли в нем ваша папка.</msg>
<msg key="lt_Either_there_is_alrea">Папка с именем &quot;%folder_name%&quot; уже существует либо вы нажали на кнопку более одного раза.Вы можете воспользоваться кнопкой Назад, чтобы вернуться и выбрать новое имя, или &lt;a href=&quot;%directory_url%&quot;&gt;вернуться к списку директорий&lt;/a&gt; чтобы проверить, есть ли в нем ваша папка.</msg>
<msg key="lt_File-Storage_folder_f">Папка хранения файлов: %folder_name%</msg>
<msg key="lt_File_Storage_Notifica">Уведомление из Хранилища файлов </msg>
<msg key="lt_Folder_folder_name_is">Папка %folder_name% пуста.</msg>
<msg key="lt_It_appears_that_there">Похоже, что файл с таким именем уже существует в данной папке (также вероятно, что вы нажали на кнопку предоставления более одного раза.)</msg>
<msg key="lt_Leave_blank_for_linked_documents">Оставьте поле заголовка пустым при загрузке нескольких взаимосвязанных документов.</msg>
<msg key="lt_Live_version_of_title">Актуальная версия &#34;%title%&#34;.</msg>
<msg key="lt_Live_version_of_title">Актуальная версия &quot;%title%&quot;.</msg>
<msg key="lt_Modify_permissions_on">Изменить права доступа к данному файлу</msg>
<msg key="lt_Modify_permissions_on_1">Изменить права доступа к этой папке</msg>
<msg key="lt_Move_Checked_Items_to">Перенести выбранные позиции в другую папку</msg>
......@@ -104,8 +104,8 @@
<msg key="lt_not_allowed_count_ite">%not_allowed_count% позиции не могут быть перемещены</msg>
<msg key="lt_Notification_for_File">Уведомление для: Хранилище файлов: %action_type%</msg>
<msg key="lt_Please_enter_the_new_">Пожалуйста, введите новое имя данного файла:</msg>
<msg key="lt_Select_the_folder_tha">Выберите папку, в которую вы желаете скопировать&#34;%file_name%&#34;</msg>
<msg key="lt_Select_the_folder_tha_1">Выберите папку, в которую вы желаете переместить&#34;%file_name%&#34;</msg>
<msg key="lt_Select_the_folder_tha">Выберите папку, в которую вы желаете скопировать&quot;%file_name%&quot;</msg>
<msg key="lt_Select_the_folder_tha_1">Выберите папку, в которую вы желаете переместить&quot;%file_name%&quot;</msg>
<msg key="lt_Show_files_modified_i">Показать файлы, измененные за последние</msg>
<msg key="lt_show_only_live_versio">показать только актуальную версию</msg>
<msg key="lt_The_folder_link_you_s">Выбранная вами папка %folder_link% уже содержит файл с тем же именем.</msg>
......@@ -120,7 +120,7 @@
<msg key="lt_Upload_a_compressed_f">Выгрузить сжатую папку, которая будет разархивирована как есть.</msg>
<msg key="lt_Upload_a_file_in_this">Загрузить файл в эту папку</msg>
<msg key="lt_Upload_compressed_fol">Загрузить сжатую папку</msg>
<msg key="lt_Use_the_Browse_button">Выберите файл при помощи кнопки &#34;Browse...&#34; (&#34;Найти...&#34;) и нажмите &#34;Open&#34; (&#34;Открыть&#34;).</msg>
<msg key="lt_Use_the_Browse_button">Выберите файл при помощи кнопки &quot;Browse...&quot; (&quot;Найти...&quot;) и нажмите &quot;Open&quot; (&quot;Открыть&quot;).</msg>
<msg key="lt_version_not_valid">Заданная версия недостоверна.</msg>
<msg key="lt_Version_Notes_descrip">Примечания к версии: %description%</msg>
<msg key="lt_View_folder_contents_">Просмотреть содержание папки: %url_version%</msg>
......@@ -131,8 +131,8 @@
<msg key="lt_You_probably_clicked_">Вероятно, вы нажали на кнопку Добавить более одного раза. Проверьте, корректно ли загрузился файл в выбранную вами папку %folder_link% или воспользуйтесь кнопкой Назад, чтобы вернуться и заново ввести версию файла.</msg>
<msg key="lt_Your_file_is_larger_t">Размер вашего файла превышает максимально допустимый для данной системы (%number_of_bytes% байтов)</msg>
<msg key="lt_Your_file_is_larger_t_1">Размер вашего файла превышает максимально допустимый для данной системы (%max_number_of_bytes% байтов)</msg>
<msg key="lt_Your_search_on_query_">По вашему запросу&#34;%query%&#34; ничего не найдено.</msg>
<msg key="lt_Your_search_on_query__1">По вашему запросу&#34;%query%&#34; найдены следующие файлы:</msg>
<msg key="lt_Your_search_on_query_">По вашему запросу&quot;%query%&quot; ничего не найдено.</msg>
<msg key="lt_Your_search_on_query__1">По вашему запросу&quot;%query%&quot; найдены следующие файлы:</msg>
<msg key="Modified">Изменено</msg>
<msg key="Move">Переместить</msg>
<msg key="Move_File">Переместить файл</msg>
......
......@@ -56,23 +56,23 @@
<msg key="last_week">上周</msg>
<msg key="link">链接</msg>
<msg key="lt_administer_permission">管理许可</msg>
<msg key="lt_All_Versions_of_title">&#34;%title%&#34;的所有版本</msg>
<msg key="lt_Are_you_sure_that_you">确实要删除&#34;%title%&#34;的版本&#34;%version_name%&#34;吗?此操作是不可逆转的。</msg>
<msg key="lt_All_Versions_of_title">&quot;%title%&quot;的所有版本</msg>
<msg key="lt_Are_you_sure_that_you">确实要删除&quot;%title%&quot;的版本&quot;%version_name%&quot;吗?此操作是不可逆转的。</msg>
<msg key="lt_bad_folder_id_folder_">丢失文件夹id</msg>
<msg key="lt_Comments_on_this_file">批注文件:</msg>
<msg key="lt_contentscontent_size_">%contents.content_size_pretty%字节 </msg>
<msg key="lt_delete_file">确实要删除文件&#34;%title%&#34;及其所有的版本吗?此操作是不可逆转的。</msg>
<msg key="lt_delete_folder">确实要删除文件夹&#34;%folder_name%&#34;及文件夹下所有内容吗?此操作是不可逆转的。</msg>
<msg key="lt_delete_file">确实要删除文件&quot;%title%&quot;及其所有的版本吗?此操作是不可逆转的。</msg>
<msg key="lt_delete_folder">确实要删除文件夹&quot;%folder_name%&quot;及文件夹下所有内容吗?此操作是不可逆转的。</msg>
<msg key="lt_Delete_this_file_incl">删除此文件所有版本</msg>
<msg key="lt_Do_you_want_to_delete">要删除所列项吗?</msg>
<msg key="lt_Download_an_archive_o">下载此文件夹下所有存档文件</msg>
<msg key="lt_Either_there_is_alrea">已有一个名为&#34;%folder_name%&#34;的文件夹存在或多次点击按钮。用返回钮返回,选一个新名字,或&lt;a href=&#34;%directory_url%&#34;&gt;返回到目录列表&lt;/a&gt;,看文件夹是否在列表中。 </msg>
<msg key="lt_Either_there_is_alrea">已有一个名为&quot;%folder_name%&quot;的文件夹存在或多次点击按钮。用返回钮返回,选一个新名字,或&lt;a href=&quot;%directory_url%&quot;&gt;返回到目录列表&lt;/a&gt;,看文件夹是否在列表中。 </msg>
<msg key="lt_File-Storage_folder_f">文件存储文件夹:%folder_name%\n</msg>
<msg key="lt_File_Storage_Notifica">文件存储通知</msg>
<msg key="lt_Folder_folder_name_is">文件夹%folder_name%为空。</msg>
<msg key="lt_It_appears_that_there">该文件夹中已有一个同名文件。</msg>
<msg key="lt_Leave_blank_for_linked_documents">上传多链接文件时标题空白。</msg>
<msg key="lt_Live_version_of_title">&#34;%title%&#34;的活动版本</msg>
<msg key="lt_Live_version_of_title">&quot;%title%&quot;的活动版本</msg>
<msg key="lt_Modify_permissions_on">修改文件许可</msg>
<msg key="lt_Modify_permissions_on_1">修改文件夹许可</msg>
<msg key="lt_Moving_allowed_count_">移动%allowed_count%</msg>
......@@ -83,8 +83,8 @@
<msg key="lt_not_allowed_count_ite">%not_allowed_count%不能被移动</msg>
<msg key="lt_Notification_for_File">文件存储通知:%action_type%\n</msg>
<msg key="lt_Please_enter_the_new_">请输入新文件名:</msg>
<msg key="lt_Select_the_folder_tha">选择&#34;%file_name%&#34;拷贝的目标文件夹</msg>
<msg key="lt_Select_the_folder_tha_1">选择&#34;%file_name%&#34;移动的目标文件夹</msg>
<msg key="lt_Select_the_folder_tha">选择&quot;%file_name%&quot;拷贝的目标文件夹</msg>
<msg key="lt_Select_the_folder_tha_1">选择&quot;%file_name%&quot;移动的目标文件夹</msg>
<msg key="lt_Show_files_modified_i">显示</msg>
<msg key="lt_show_only_live_versio">仅显示活动版本</msg>
<msg key="lt_The_folder_link_you_s">文件夹%folder_link%中包含同名文件。</msg>
......@@ -108,8 +108,8 @@
<msg key="lt_You_probably_clicked_">可能多次点击“增加”钮。检查文件是否已装入了文件夹%folder_link%,或用“返回”钮返回,重新进入版本文件。</msg>
<msg key="lt_Your_file_is_larger_t">文件大于系统允许的最大文件值((%number_of_bytes%字节)</msg>
<msg key="lt_Your_file_is_larger_t_1">文件大于系统允许的最大文件值((%max_number_of_bytes%字节)</msg>
<msg key="lt_Your_search_on_query_">&#34;%query%&#34;搜索没有结果。</msg>
<msg key="lt_Your_search_on_query__1">&#34;%query%&#34;搜索到下述的文件:</msg>
<msg key="lt_Your_search_on_query_">&quot;%query%&quot;搜索没有结果。</msg>
<msg key="lt_Your_search_on_query__1">&quot;%query%&quot;搜索到下述的文件:</msg>
<msg key="Modified">已修改</msg>
<msg key="Move">移动</msg>
<msg key="Move_File">移动文件</msg>
......@@ -147,7 +147,7 @@
<msg key="Upload_a_new_version">上传新版本</msg>
<msg key="Upload_Limit">上传限制(字节)</msg>
<msg key="Upload_limit_error">上传不得超过</msg>
<msg key="Upload_limit_error_2">字节。请增加AOLserver&#39;s Tcl设置文件中的上传限制设置。 </msg>
<msg key="Upload_limit_error_2">字节。请增加AOLserver's Tcl设置文件中的上传限制设置。 </msg>
<msg key="Upload_New_File">上传新文件</msg>
<msg key="Upload_New_Version">上传新版本</msg>
<msg key="Upload_Revision">上传版本</msg>
......
......@@ -7,22 +7,23 @@
<initial-install-p>f</initial-install-p>
<singleton-p>f</singleton-p>
<version name="5.9.0" url="http://openacs.org/repository/download/apm/file-storage-5.9.0.apm">
<version name="5.9.1" url="http://openacs.org/repository/download/apm/file-storage-5.9.1.apm">
<owner url="http://openacs.org">OpenACS</owner>
<summary>Collaborative document storage</summary>
<release-date>2015-10-04</release-date>
<release-date>2017-08-06</release-date>
<vendor url="http://openacs.org">OpenACS</vendor>
<description format="text/plain">Provides a versioned document store with storage in the filesystem or database (depending on configuration). Documents and folders can be permissioned and folders downloaded.</description>
<license>GPL version 2</license>
<maturity>2</maturity>
<package_instance_name>#file-storage.file-storage#</package_instance_name>
<provides url="file-storage" version="5.9.0"/>
<requires url="acs-kernel" version="5.9.0"/>
<requires url="acs-content-repository" version="5.9.0"/>
<provides url="file-storage" version="5.9.1"/>
<requires url="acs-kernel" version="5.9.1"/>
<requires url="acs-tcl" version="5.9.1"/>
<requires url="acs-content-repository" version="5.9.1"/>
<requires url="categories" version="1.1.2d3"/>
<requires url="notifications" version="5.9.0"/>
<requires url="categories" version="1.1.3"/>
<requires url="notifications" version="5.9.1"/>
<requires url="oacs-dav" version="1.1b1"/>
<requires url="rss-support" version="0.3"/>
......
......@@ -3,14 +3,16 @@
<queryset>
<rdbms><type>oracle</type><version>8.1.6</version></rdbms>
<partialquery name="parent_context_all">
<partialquery name="permission_clause">
<querytext>
fs_objects.object_id in (select item_id from cr_items
connect by prior parent_id=item_id
start with parent_id=:folder_id)
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = fs_objects.object_id
and m.party_id = :viewing_user_id
and m.privilege = 'read')
</querytext>
</partialquery>
<fullquery name="select_folder_contents">
<querytext>
......
<?xml version="1.0"?>
<queryset>
<rdbms><type>postgresql</type><version>7.3</version></rdbms>D
<partialquery name="parent_context_all">
<rdbms><type>postgresql</type><version>7.3</version></rdbms>
<partialquery name="permission_clause">
<querytext>
fs_objects.object_id in (select item_id from cr_items where
tree_sortkey between (select tree_sortkey from cr_items where
item_id = :folder_id) and (select tree_right(tree_sortkey) from
cr_items where item_id = :folder_id)
and acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'read')
</querytext>
</partialquery>
<fullquery name="select_folder_contents">
<querytext>
......
<if @permission_p@ eq 1>
<if @permission_p;literal@ true>
<if @contents:rowcount@ gt 0>
<multiple name="contents">
<if @contents.type@ ne "folder">
<a href="@contents.file_url@">@contents.title@</a> <if @admin_p@ eq 1><a href="@contents.properties_url@">#acs-kernel.common_Edit#</a></if><br>
<a href="@contents.file_url@">@contents.title@</a> <if @admin_p;literal@ true><a href="@contents.properties_url@">#acs-kernel.common_Edit#</a></if><br>
</if>
</multiple>
</if></if>
......@@ -3,122 +3,113 @@
# @param base_url URL to prepend to the relative URL from file-storage
# used to deliver content from another index.vuh than
# file-storage/view/
if {(![info exists base_url] || $base_url eq "")} {
if {![info exists base_url] || $base_url eq ""} {
set base_url "/view/"
}
# @param object_list restrict results to object_ids in object_list
if {(![info exists object_list] || $object_list eq "")} {
if {![info exists object_list] || $object_list eq ""} {
set object_list {}
}
# @param show_all_p include subfolders and contents? default 0
if {(![info exists show_all_p] || $show_all_p eq "")} {
if {![info exists show_all_p] || $show_all_p eq ""} {
set show_all_p 0
}
# @param admin_p show links to properties page for a file? default 0
if {(![info exists admin_p] || $admin_p eq "")} {
if {![info exists admin_p] || $admin_p eq ""} {
set admin_p 0
}
# @param return_url URL to add to admin links
if {(![info exists return_url] || $return_url eq "")} {
if {![info exists return_url] || $return_url eq ""} {
set return_url [ad_return_url]
}
if {$show_all_p} {
set parent_context_where [db_map parent_context_all]
} else {
set parent_context_where " fs_objects.parent_id = :folder_id"
}
set object_list_where ""
set viewing_user_id [ad_conn user_id]
set permission_clause " and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = fs_objects.object_id
and m.party_id = :viewing_user_id
and m.privilege = 'read')"
if {[info exists permission_check] && $permission_check eq 0 } {
set permission_p 1
set permission_clause ""
set permission_clause [db_map permission_clause]
} else {
set permission_p [permission::permission_p -party_id $viewing_user_id -object_id $folder_id -privilege "read"]
set permission_clause ""
}
set folder_name [lang::util::localize [fs::get_object_name -object_id $folder_id]]
lassign [fs::get_folder_package_and_root $folder_id] package_id root_folder_id
set fs_url [site_node::get_url_from_object_id -object_id $package_id]
if {$root_folder_id ne $folder_id && "/view/" eq $base_url} {
set folder_path [db_exec_plsql get_folder_path {}]
lassign [fs::get_folder_package_and_root $folder_id] package_id root_folder_id
set fs_url [site_node::get_url_from_object_id -object_id $package_id]
if {$root_folder_id ne $folder_id && "/view/" eq $base_url} {
set folder_path [db_exec_plsql get_folder_path {}]
} else {
set folder_path ""
}
if {[llength $object_list] > 0} {
set object_list_where " and fs_objects.object_id in ([join $object_list ", "])"
}
db_multirow -extend {
edit_url icon last_modified_pretty content_size_pretty properties_link
properties_url download_url target_tag
} contents select_folder_contents {} {
set last_modified_ansi [lc_time_system_to_conn $last_modified_ansi]
set last_modified_pretty [lc_time_fmt $last_modified_ansi "%x %X"]
# if {$description ne ""} {
# set description " - $description"
# }
if {$type eq "folder"} {
set content_size_pretty [lc_numeric $content_size]
append content_size_pretty " [_ file-storage.items]"
set pretty_type "Folder"
} else {
set folder_path ""
}
if {$content_size < 1024} {
set content_size_pretty "[lc_numeric $content_size] [_ file-storage.bytes]"
} else {
set content_size_pretty "[lc_numeric [expr {$content_size / 1024 }]] [_ file-storage.kb]"
}
if {[llength $object_list]} {
set object_list_where " and fs_objects.object_id in ([join $object_list ", "])"
}
db_multirow -extend { edit_url icon last_modified_pretty content_size_pretty properties_link properties_url download_url target_tag } contents select_folder_contents {} {
set last_modified_ansi [lc_time_system_to_conn $last_modified_ansi]
set last_modified_pretty [lc_time_fmt $last_modified_ansi "%x %X"]
# if {$description ne ""} {
# set description " - $description"
# }
if {$type eq "folder"} {
set content_size_pretty [lc_numeric $content_size]
append content_size_pretty " [_ file-storage.items]"
set pretty_type "Folder"
} else {
if {$content_size < 1024} {
set content_size_pretty "[lc_numeric $content_size] [_ file-storage.bytes]"
} else {
set content_size_pretty "[lc_numeric [expr {$content_size / 1024 }]] [_ file-storage.kb]"
}
}
set file_upload_name [fs::remove_special_file_system_characters -string $file_upload_name]
set name [lang::util::localize $name]
if {![info exists download_base_url] } {
set download_base_url ""
}
switch -- $type {
folder {
set properties_link ""
set properties_url ""
set icon ""
set file_url ""
set download_url ""
}
url {
set properties_link "properties"
set properties_url [export_vars -base ${fs_url}simple {object_id return_url}]
set icon "/resources/acs-subsite/url-button.gif"
set file_url ${url}
set download_url $file_url
}
default {
set properties_link [_ file-storage.properties]
set properties_url [export_vars -base ${fs_url}file {{file_id $object_id} return_url}]
set icon "/resources/file-storage/file.gif"
set file_url "${base_url}${file_url}"
set download_url [export_vars -base ${fs_url}download {{file_id $object_id}}]
}
}
# We need to encode the hashes in any i18n message keys (.LRN plays this trick on some of its folders).
# If we don't, the hashes will cause the path to be chopped off (by ns_conn url) at the leftmost hash.
regsub -all {\#} $file_url {%23} file_url
set name [lang::util::localize $name]
if {![info exists download_base_url] } {
set download_base_url ""
}
switch -- $type {
folder {
set properties_link ""
set properties_url ""
set icon ""
set file_url ""
set download_url ""
}
url {
set properties_link "properties"
set properties_url [export_vars -base ${fs_url}simple {object_id return_url}]
set icon "/resources/acs-subsite/url-button.gif"
set file_url ${url}
set download_url $file_url
}
default {
set properties_link [_ file-storage.properties]
set properties_url [export_vars -base ${fs_url}file {{file_id $object_id} return_url}]
set icon "/resources/file-storage/file.gif"
set file_url "${base_url}${file_url}"
set download_url [export_vars -base ${fs_url}download {{file_id $object_id}}]
}
}
# We need to encode the hashes in any i18n message keys (.LRN plays this trick on some of its folders).
# If we don't, the hashes will cause the path to be chopped off (by ns_conn url) at the leftmost hash.
regsub -all {\#} $file_url {%23} file_url
}
ad_return_template
ad_return_template
# Local variables:
# mode: tcl
......
......@@ -6,155 +6,6 @@
-- @version $Id$
--
create or replace package file_storage
as
function get_root_folder(
--
-- Returns the root folder corresponding to a particular
-- package instance.
--
package_id in apm_packages.package_id%TYPE
) return fs_root_folders.folder_id%TYPE;
function get_package_id(
item_id in cr_items.item_id%TYPE
) return fs_root_folders.package_id%TYPE;
function new_root_folder(
--
-- Creates a new root folder
--
package_id in apm_packages.package_id%TYPE,
folder_name in cr_folders.label%TYPE default null,
folder_url in cr_items.name%TYPE default null,
description in cr_folders.description%TYPE default null
) return fs_root_folders.folder_id%TYPE;
function new_file(
--
-- Create a file in CR in preparation for actual storage
-- Wrapper for content_item.new
--
item_id in cr_items.item_id%TYPE default null,
title in cr_items.name%TYPE,
folder_id in cr_items.parent_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE,
indb_p in char default 't',
package_id in acs_objects.package_id%TYPE default null
) return cr_items.item_id%TYPE;
procedure delete_file(
--
-- Delete a file and all its version
-- Wrapper to content_item.delete
--
file_id in cr_items.item_id%TYPE
);
procedure rename_file(
--
-- Rename a file and all
-- Wrapper to content_item__edit_name
--
file_id in cr_items.item_id%TYPE,
title in cr_items.name%TYPE
);
function copy_file(
--
-- Copy a file, but only copy the live_revision
--
file_id in cr_items.item_id%TYPE,
target_folder_id in cr_items.parent_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE
) return cr_revisions.revision_id%TYPE;
procedure move_file(
--
-- Move a file, and all its versions, to a new folder
--
file_id in cr_items.item_id%TYPE,
target_folder_id in cr_items.parent_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE
);
function get_title(
--
-- Unfortunately, title in the file-storage context refers
-- to the name attribute in cr_items, not the title attribute in
-- cr_revisions
item_id in cr_items.item_id%TYPE
) return varchar;
function get_parent_id(
item_id in cr_items.item_id%TYPE
) return cr_items.item_id%TYPE;
function get_content_type(
--
-- Wrapper for content_item. get_content_type
--
item_id in cr_items.item_id%TYPE
) return cr_items.content_type%TYPE;
function get_folder_name(
--
-- Wrapper for content_folder.get_label
--
folder_id in cr_folders.folder_id%TYPE
) return cr_folders.label%TYPE;
function new_version(
--
-- Create a new version of a file
-- Wrapper for content_revision.new
--
filename in cr_revisions.title%TYPE,
description in cr_revisions.description%TYPE,
mime_type in cr_revisions.mime_type%TYPE,
item_id in cr_items.item_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE
) return cr_revisions.revision_id%TYPE;
function delete_version(
--
-- Delete a version of a file
--
file_id in cr_items.item_id%TYPE,
version_id in cr_revisions.revision_id%TYPE
) return cr_items.parent_id%TYPE;
function new_folder(
--
-- Create a folder
--
name in cr_items.name%TYPE,
folder_name in cr_folders.label%TYPE,
parent_id in cr_items.parent_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE
) return cr_folders.folder_id%TYPE;
procedure delete_folder(
--
-- Delete a folder
-- adding cascade_p but defaulting to false
-- this will fail if a folder contains anything
-- but just in case some other application uses
-- this api it will not change the behavior
folder_id in cr_folders.folder_id%TYPE,
cascade_p in char default 'f'
);
end file_storage;
/
show errors
create or replace package body file_storage
as
......@@ -308,10 +159,12 @@ as
--
-- Copy a file, but only copy the live_revision
--
file_id in cr_items.item_id%TYPE,
file_id in cr_items.item_id%TYPE,
target_folder_id in cr_items.parent_id%TYPE,
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE
creation_user in acs_objects.creation_user%TYPE,
creation_ip in acs_objects.creation_ip%TYPE,
name in cr_items.name%TYPE default null,
title in cr_revisions.title%TYPE default null
) return cr_revisions.revision_id%TYPE
is
v_title cr_items.name%TYPE;
......@@ -339,6 +192,9 @@ as
and r.revision_id = i.live_revision
and i.item_id = file_storage.copy_file.file_id;
v_filename := nvl(copy.name, v_filename);
v_title := nvl(copy.title, v_title);
-- We should probably use the copy functions of CR
-- when we optimize this function
v_new_file_id := file_storage.new_file(
......
This diff is collapsed.
......@@ -26,9 +26,9 @@ CREATE OR REPLACE FUNCTION inline_0(
DECLARE
rec_root_folder record;
template_id integer;
v_count integer;
v_count integer;
BEGIN
-- Skip if already dropped
-- Skip if already dropped
select count(*) into v_count from user_tab_columns where lower(table_name) = 'fs_root_folders';
if v_count = 0 then return 0; end if;
......@@ -50,6 +50,7 @@ BEGIN
END;
$$ LANGUAGE plpgsql;
select inline_0();
drop function inline_0();
......
......@@ -306,12 +306,11 @@ END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('file_storage__copy_file','file_id,target_folder_id,creation_user,creation_ip');
select define_function_args('file_storage__copy_file','file_id,target_folder_id,creation_user,creation_ip,name;null,title;null');
--
-- procedure file_storage__copy_file/4
-- procedure file_storage__copy_file/6
--
--
-- Copy a file, but only copy the live_revision
......@@ -320,7 +319,9 @@ CREATE OR REPLACE FUNCTION file_storage__copy_file(
copy_file__file_id integer,
copy_file__target_folder_id integer,
copy_file__creation_user integer,
copy_file__creation_ip varchar
copy_file__creation_ip varchar,
copy_file__name cr_items.name%TYPE default null,
copy_file__title cr_revisions.title%TYPE default null
)
RETURNS integer AS $$
DECLARE
......@@ -334,7 +335,7 @@ DECLARE
v_new_lob_id cr_revisions.lob%TYPE;
v_file_path cr_revisions.content%TYPE;
v_new_file_id cr_items.item_id%TYPE;
v_new_version_id cr_revisions.revision_id%TYPE;
v_new_version_id cr_revisions.revision_id%TYPE;
v_indb_p boolean;
v_isurl boolean;
v_content_type cr_items.content_type%TYPE;
......@@ -364,8 +365,11 @@ BEGIN
select package_id into v_package_id from acs_objects where object_id = copy_file__file_id;
v_name := coalesce(copy_file__name, v_name);
v_filename := coalesce(copy_file__title, v_filename);
v_new_file_id := file_storage__new_file(
v_name, -- name
v_name, -- name
copy_file__target_folder_id, -- folder_id
copy_file__creation_user, -- creation_user
copy_file__creation_ip, -- creation_ip
......@@ -426,7 +430,6 @@ END;
$$ LANGUAGE plpgsql;
-- added
select define_function_args('file_storage__move_file','file_id,target_folder_id,creation_user,creation_ip');
......@@ -604,7 +607,9 @@ BEGIN
null, -- revision_id
now(), -- creation_date
new_version__creation_user, -- creation_user
new_version__creation_ip -- creation_ip
new_version__creation_ip, -- creation_ip
null, -- content_length
null -- package_id
);
-- Make live the newly created revision
......
......@@ -7,7 +7,7 @@
--
drop view if exists fs_urls_full;
create view fs_urls_full
create or replace view fs_urls_full
as
select cr_extlinks.extlink_id as url_id,
cr_extlinks.url,
......
......@@ -33,6 +33,32 @@ SELECT inline_0 ();
DROP FUNCTION inline_0 ();
-- delete from cr_folder_type_map
-- where content_type not in ( 'file_storage_object', 'content_folder', 'content_extlink')
-- and folder_id in (
-- select o2.object_id as folder_id from acs_objects o1, acs_objects o2
-- where o1.object_id in (select folder_id from fs_root_folders)
-- and o2.tree_sortkey between o1.tree_sortkey
-- and tree_right(o1.tree_sortkey)
-- and o2.object_type = 'content_folder');
--
-- The query above reformulated as recursive query to avoid the
-- dependency on acs_objects.tree_sortkey
--
delete from cr_folder_type_map
where content_type not in ( 'file_storage_object', 'content_folder', 'content_extlink')
and folder_id in (
with recursive folders as (
select folder_id from fs_root_folders
union all
select i.item_id as folder_id from folders, cr_items i, acs_objects o
where folders.folder_id = i.parent_id and o.object_id = i.item_id
and o.object_type = 'content_folder'
) select * from folders);
--- from file-storage-package-create.sql
CREATE OR REPLACE FUNCTION file_storage__new_folder(
......@@ -44,8 +70,8 @@ CREATE OR REPLACE FUNCTION file_storage__new_folder(
)
RETURNS integer AS $$
DECLARE
v_folder_id integer;
v_package_id integer;
v_folder_id cr_folders.folder_id%TYPE;
v_package_id acs_objects.package_id%TYPE;
BEGIN
v_package_id := file_storage__get_package_id(new_folder__parent_id);
......@@ -109,7 +135,7 @@ CREATE OR REPLACE FUNCTION file_storage__new_root_folder(
)
RETURNS integer AS $$
DECLARE
v_folder_id integer;
v_folder_id fs_root_folders.folder_id%TYPE;
BEGIN
v_folder_id := content_folder__new (
new_root_folder__url, -- name
......
begin;
drop function if exists file_storage__copy_file(
copy_file__file_id integer,
copy_file__target_folder_id integer,
copy_file__creation_user integer,
copy_file__creation_ip character varying
);
-- added
select define_function_args('file_storage__copy_file','file_id,target_folder_id,creation_user,creation_ip,name;null,title;null');
--
-- procedure file_storage__copy_file/6
--
--
-- Copy a file, but only copy the live_revision
--
CREATE OR REPLACE FUNCTION file_storage__copy_file(
copy_file__file_id integer,
copy_file__target_folder_id integer,
copy_file__creation_user integer,
copy_file__creation_ip varchar,
copy_file__name cr_items.name%TYPE default null,
copy_file__title cr_revisions.title%TYPE default null
)
RETURNS integer AS $$
DECLARE
v_name cr_items.name%TYPE;
v_live_revision cr_items.live_revision%TYPE;
v_filename cr_revisions.title%TYPE;
v_description cr_revisions.description%TYPE;
v_mime_type cr_revisions.mime_type%TYPE;
v_content_length cr_revisions.content_length%TYPE;
v_lob_id cr_revisions.lob%TYPE;
v_new_lob_id cr_revisions.lob%TYPE;
v_file_path cr_revisions.content%TYPE;
v_new_file_id cr_items.item_id%TYPE;
v_new_version_id cr_revisions.revision_id%TYPE;
v_indb_p boolean;
v_isurl boolean;
v_content_type cr_items.content_type%TYPE;
v_package_id apm_packages.package_id%TYPE;
BEGIN
v_isurl:= false;
select content_type into v_content_type from cr_items where item_id = copy_file__file_id;
if v_content_type = 'content_extlink'
then
v_isurl:= true;
end if;
-- We copy only the title from the file being copied, and attributes of the live revision
if v_isurl = false
then
select i.name,i.live_revision,r.title,r.description,r.mime_type,r.content_length,
(case when i.storage_type = 'lob'
then true
else false
end)
into v_name,v_live_revision,v_filename,v_description,v_mime_type,v_content_length,v_indb_p
from cr_items i, cr_revisions r
where r.item_id = i.item_id
and r.revision_id = i.live_revision
and i.item_id = copy_file__file_id;
select package_id into v_package_id from acs_objects where object_id = copy_file__file_id;
v_name := coalesce(copy_file__name, v_name);
v_filename := coalesce(copy_file__title, v_filename);
v_new_file_id := file_storage__new_file(
v_name, -- name
copy_file__target_folder_id, -- folder_id
copy_file__creation_user, -- creation_user
copy_file__creation_ip, -- creation_ip
v_indb_p, -- indb_p
v_package_id -- package_id
);
v_new_version_id := file_storage__new_version (
v_filename, -- title
v_description, -- description
v_mime_type, -- mime_type
v_new_file_id, -- item_id
copy_file__creation_user, -- creation_user
copy_file__creation_ip -- creation_ip
);
if v_indb_p
then
-- Lob to copy from
select lob into v_lob_id
from cr_revisions
where revision_id = v_live_revision;
-- New lob id
v_new_lob_id := empty_lob();
-- copy the blob
perform lob_copy(v_lob_id,v_new_lob_id);
-- Update the lob id on the new version
update cr_revisions
set lob = v_new_lob_id,
content_length = v_content_length
where revision_id = v_new_version_id;
else
-- For now, we simply copy the file name
select content into v_file_path
from cr_revisions
where revision_id = v_live_revision;
-- Update the file path
update cr_revisions
set content = v_file_path,
content_length = v_content_length
where revision_id = v_new_version_id;
end if;
perform acs_object__update_last_modified(copy_file__target_folder_id,copy_file__creation_user,copy_file__creation_ip);
return v_new_version_id;
else
perform content_extlink__copy (copy_file__file_id, copy_file__target_folder_id, copy_file__creation_user,copy_file__creation_ip,v_name);
return 0;
end if;
END;
$$ LANGUAGE plpgsql;
end;
--
-- content_revision__new/11 is deprecated, call content_revision__new/13 instead
--
CREATE OR REPLACE FUNCTION file_storage__new_version(
new_version__filename varchar,
new_version__description varchar,
new_version__mime_type varchar,
new_version__item_id integer,
new_version__creation_user integer,
new_version__creation_ip varchar
)
RETURNS integer AS $$
DECLARE
v_revision_id cr_revisions.revision_id%TYPE;
v_folder_id cr_items.parent_id%TYPE;
BEGIN
-- Create a revision
v_revision_id := content_revision__new (
new_version__filename, -- title
new_version__description, -- description
now(), -- publish_date
new_version__mime_type, -- mime_type
null, -- nls_language
null, -- data (default)
new_version__item_id, -- item_id
null, -- revision_id
now(), -- creation_date
new_version__creation_user, -- creation_user
new_version__creation_ip, -- creation_ip
null, -- content_length
null -- package_id
);
-- Make live the newly created revision
perform content_item__set_live_revision(v_revision_id);
select cr_items.parent_id
into v_folder_id
from cr_items
where cr_items.item_id = new_version__item_id;
perform acs_object__update_last_modified(v_folder_id,new_version__creation_user,new_version__creation_ip);
perform acs_object__update_last_modified(new_version__item_id,new_version__creation_user,new_version__creation_ip);
return v_revision_id;
END;
$$ LANGUAGE plpgsql;
......@@ -18,29 +18,7 @@
i.storage_type as storage_type
from cr_items i, cr_revisions r
where r.item_id = i.item_id
and r.revision_id = :revision_id
</querytext>
</fullquery>
<fullquery name="fs_get_package_id">
<querytext>
select f.package_id as package_id
from fs_root_folders f,
(select i2.parent_id
from cr_items i1, cr_items i2, cr_revisions r
where i1.item_id = r.item_id
and r.revision_id = :revision_id
and i2.tree_sortkey <= i1.tree_sortkey
and i1.tree_sortkey i2.tree_sortkey and tree_right(i2.tree_sortkey)) as i
where f.folder_id = i.parent_id
</querytext>
</fullquery>
<fullquery name="fs_get_url_stub">
<querytext>
select site_node.url(node_id) as url_stub
from site_nodes
where object_id=:package_id
and r.revision_id = :object_id
</querytext>
</fullquery>
......
......@@ -7,40 +7,18 @@
<fullquery name="fs_datasource">
<querytext>
select r.revision_id as object_id,
i.name as title,
(case i.storage_type
i.name as title,
(case i.storage_type
when 'lob' then r.lob::text
when 'file' then '[cr_fs_path]' || r.content
else r.content
end) as content,
r.mime_type as mime,
'' as keywords,
i.storage_type as storage_type
from cr_items i, cr_revisions r
end) as content,
r.mime_type as mime,
'' as keywords,
i.storage_type as storage_type
from cr_items i, cr_revisions r
where r.item_id = i.item_id
and r.revision_id = :revision_id
</querytext>
</fullquery>
<fullquery name="fs_get_package_id">
<querytext>
select f.package_id as package_id
from fs_root_folders f,
(select i2.parent_id
from cr_items i1, cr_items i2, cr_revisions r
where i1.item_id = r.item_id
and r.revision_id = :revision_id
and i2.tree_sortkey <= i1.tree_sortkey
and i1.tree_sortkey i2.tree_sortkey and tree_right(i2.tree_sortkey)) as i
where f.folder_id = i.parent_id
</querytext>
</fullquery>
<fullquery name="fs_get_url_stub">
<querytext>
select site_node__url(node_id) as url_stub
from site_nodes
where object_id=:package_id
and r.revision_id = :object_id
</querytext>
</fullquery>
......
......@@ -60,22 +60,8 @@ ad_proc -public -callback search::datasource -impl file_storage_object {} {
} {
# We probably don't need the whole big query here. TODO: Review.
db_0or1row fs_datasource {
select r.revision_id as object_id,
i.name as title,
case i.storage_type
when 'lob' then r.lob::text
when 'file' then '[cr_fs_path]' || r.content
else r.content
end as content,
r.mime_type as mime,
'' as keywords,
i.storage_type as storage_type
from cr_items i, cr_revisions r
where r.item_id = i.item_id
and r.revision_id = :object_id
} -column_array datasource
db_0or1row dbqd.file-storage.tcl.file-storage-callback-procs.fs_datasource {} -column_array datasource
return [list object_id $object_id \
title $datasource(title) \
content $datasource(content) \
......@@ -90,7 +76,9 @@ ad_proc -public -callback search::url -impl file_storage_object {
Return the URL to the file_storage_object
} {
set item_id [content::revision::item_id -revision_id $object_id]
set name [db_string item "select name from cr_items where item_id = :item_id" -default ""]
set name [db_string item {
select name from cr_items where item_id = :item_id
} -default ""]
return "[ad_url]/file/$item_id/$name"
}
......
......@@ -75,7 +75,7 @@ ad_proc fs::impl::fs_object::put {} {
set response [list 204]
}
file delete $tmp_filename
file delete -- $tmp_filename
return $response
}
......
......@@ -52,9 +52,7 @@ ad_proc -private fs::install::before_uninstantiate {
{-package_id:required}
} {
} {
catch {
fs::delete_folder -folder_id [fs::get_root_folder -package_id $package_id] -no_notifications
} err_msg
fs::delete_folder -folder_id [fs::get_root_folder -package_id $package_id] -no_notifications
}
ad_proc -private fs::install::register_implementation {
......@@ -133,9 +131,9 @@ ad_proc -private fs::install::upgrade {
-spec {
4.6.2 5.1.1 {
fs::install::package_install
# delete the tcl file for the /view template created
# delete the Tcl file for the /view template created
# by content::init so it can be recreated
file delete [file join [acs_root_dir] templates "file-storage-default.tcl"]
file delete -- [file join [acs_root_dir] templates "file-storage-default.tcl"]
}
5.1.0a10 5.1.0a11 {
set spec {
......
......@@ -26,20 +26,6 @@
</querytext>
</fullquery>
<fullquery name="fs::new_folder.new_folder">
<querytext>
begin
:1 := file_storage.new_folder(
name => :name,
folder_name => :pretty_name,
parent_id => :parent_id,
creation_user => :creation_user,
creation_ip => :creation_ip
);
end;
</querytext>
</fullquery>
<fullquery name="fs::rename_folder.rename_folder">
<querytext>
begin
......@@ -256,20 +242,6 @@
</querytext>
</fullquery>
<fullquery name="fs::notification::get_url.select_fs_package_url">
<querytext>
select site_node.url(node_id)
from site_nodes
where object_id = (select r.package_id
from fs_root_folders r,
(select item_id as folder_id
from cr_items
connect by prior parent_id = item_id
start with item_id = :folder_id) t
where r.folder_id = t.folder_id)
</querytext>
</fullquery>
<fullquery name="fs::get_object_prettyname.select_object_prettyname">
<querytext>
select nvl(title,name) as prettyname
......@@ -278,4 +250,21 @@
</querytext>
</fullquery>
<fullquery name="fs::get_folder_objects.select_folder_contents">
<querytext>
select cr_items.item_id as object_id,
cr_items.name
from cr_items
where cr_items.parent_id = :folder_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = cr_items.item_id
and m.party_id = :user_id
and m.privilege = 'read')
</querytext>
</fullquery>
</queryset>
......@@ -20,18 +20,6 @@
</querytext>
</fullquery>
<fullquery name="fs::new_folder.new_folder">
<querytext>
select file_storage__new_folder(
:name,
:pretty_name,
:parent_id,
:creation_user,
:creation_ip
);
</querytext>
</fullquery>
<fullquery name="fs::rename_folder.rename_folder">
<querytext>
select content_folder__edit_name(
......@@ -44,50 +32,16 @@
</fullquery>
<fullquery name="fs::get_folder_objects.select_folder_contents">
<rdbms><type>postgresql</type><version>8.4</version></rdbms>
<querytext>
select cr_items.item_id as object_id,
cr_items.name
from cr_items
where cr_items.parent_id = :folder_id
and acs_permission__permission_p(cr_items.item_id, :user_id, 'read')
</querytext>
</fullquery>
<fullquery name="fs::get_folder_contents.select_folder_contents">
<querytext>
select fs_objects.object_id,
fs_objects.name,
fs_objects.title,
fs_objects.live_revision,
fs_objects.type,
to_char(fs_objects.last_modified, 'YYYY-MM-DD HH24:MI:SS') as last_modified_ansi,
fs_objects.content_size,
fs_objects.url,
fs_objects.key,
fs_objects.sort_key,
fs_objects.file_upload_name,
fs_objects.title,
case when fs_objects.last_modified >= (now() - interval '$n_past_days days') then 1 else 0 end as new_p,
acs_permission__permission_p(fs_objects.object_id, :user_id, 'admin') as admin_p,
acs_permission__permission_p(fs_objects.object_id, :user_id, 'delete') as delete_p,
acs_permission__permission_p(fs_objects.object_id, :user_id, 'write') as write_p
from fs_objects
where fs_objects.parent_id = :folder_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = fs_objects.object_id
and m.party_id = :user_id
and m.privilege = 'read')
order by fs_objects.sort_key, fs_objects.name
select cr_items.item_id as object_id, cr_items.name
from cr_items
where cr_items.parent_id = :folder_id
and acs_permission__permission_p(cr_items.item_id, :user_id, 'read')
</querytext>
</fullquery>
<fullquery name="fs::get_folder_contents.select_folder_contents">
<rdbms><type>postgresql</type><version>8.4</version></rdbms>
<querytext>
......@@ -258,8 +212,10 @@
<fullquery name="fs::add_version.update_last_modified">
<querytext>
begin
perform acs_object__update_last_modified (:parent_id,:creation_user,:creation_ip);
perform acs_object__update_last_modified (:item_id,:creation_user,:creation_ip);
perform acs_object__update_last_modified
(:parent_id,:creation_user,:creation_ip);
perform
acs_object__update_last_modified(:item_id,:creation_user,:creation_ip);
return null;
end;
</querytext>
......@@ -281,23 +237,6 @@
</querytext>
</fullquery>
<fullquery name="fs::notification::get_url.select_fs_package_url">
<querytext>
select site_node__url(node_id)
from site_nodes
where object_id = (select package_id
from fs_root_folders r,
(select parent.item_id as folder_id
from cr_items parent,
cr_items children
where children.item_id = :folder_id
and children.tree_sortkey
between parent.tree_sortkey
and tree_right(parent.tree_sortkey)) t
where r.folder_id = t.folder_id)
</querytext>
</fullquery>
<fullquery name="fs::add_created_version.new_file_revision">
<querytext>
select content_revision__new (
......@@ -338,25 +277,6 @@
</querytext>
</fullquery>
<fullquery name="fs::add_created_version.new_lob_revision">
<querytext>
select content_revision__new (
/* title => */ :title,
/* description => */ :description,
/* publish_date => */ current_timestamp,
/* mime_type => */ :mime_type,
/* nls_language => */ null,
/* data => */ null,
/* item_id => */ :item_id,
/* revision_id => */ :revision_id,
/* creation_date => */ current_timestamp,
/* creation_user => */ :creation_user,
/* creation_ip => */ :creation_ip,
/* package_id => */ :package_id
)
</querytext>
</fullquery>
<fullquery name="fs::add_created_version.set_lob_content">
<querytext>
......@@ -412,4 +332,5 @@
where object_id = :object_id
</querytext>
</fullquery>
</queryset>
This diff is collapsed.
......@@ -54,22 +54,6 @@
</querytext>
</fullquery>
<fullquery name="fs::get_folder_objects.select_folder_contents">
<querytext>
select cr_items.item_id as object_id,
cr_items.name
from cr_items
where cr_items.parent_id = :folder_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = cr_items.item_id
and m.party_id = :user_id
and m.privilege = 'read')
</querytext>
</fullquery>
<fullquery name="fs::get_folder_contents_count.select_folder_contents_count">
<querytext>
select count(*)
......@@ -163,15 +147,6 @@
</querytext>
</fullquery>
<fullquery name="fs::add_file.image_type_p">
<querytext>
select 1
from cr_content_mime_type_map
where mime_type = :mime_type
and content_type = 'image'
</querytext>
</fullquery>
<fullquery name="fs::add_created_version.get_storage_type">
<querytext>
select storage_type from cr_items where item_id=:item_id
......@@ -249,4 +224,4 @@
</querytext>
</fullquery>
</queryset>
\ No newline at end of file
</queryset>
......@@ -26,7 +26,7 @@ aa_register_case \
select 1 from fs_root_folders where folder_id = :folder_id
} -default "0"]
aa_equals "folder was created succesfully" $success_p 1
aa_equals "folder was created successfully" $success_p 1
}
}
......
......@@ -26,7 +26,7 @@ ad_proc file_storage:::twt::create_file { f_name } {
ad_proc file_storage:::twt::delete_file { file_name } {
# Delete a file name
exec rm -rf $file_name
file delete -force -- $file_name
}
ad_proc file_storage::twt::create_new_folder { folder_name folder_description } {
......
......@@ -5,9 +5,9 @@
<p>Back up to <a href="../?folder_id=@folder_id@">@folder_name@</a></p>
<p><b>IMPORTANT:</b> RSS subscriptions almost certainly won't work if
<p><strong>IMPORTANT:</strong> RSS subscriptions almost certainly won't work if
login is required to reach this file-storage area. If you want RSS,
your best bet is to go with a publically readable area. We'll try to
your best bet is to go with a publicly readable area. We'll try to
come up with better solutions for this in the next version of
enclosure support for file-storage.</p>
......
......@@ -18,7 +18,7 @@ ad_form -name del -form {
} -edit_data {
#here's where we actually do the delete.
db_exec_plsql delete_subscr {}
file delete [rss_gen_report_file -summary_context_id $subscr_id -impl_name fs_rss]
file delete -- [rss_gen_report_file -summary_context_id $subscr_id -impl_name fs_rss]
} -after_submit {
ad_returnredirect rss-subscrs?folder_id=$folder_id
ad_script_abort
......
......@@ -8,7 +8,7 @@ ad_page_contract {
@cvs-id $Id$
} {
{return_url ""}
{return_url:localurl ""}
}
set max_size [ns_config "ns/server/[ns_info server]/module/nssock" maxinput]
......
......@@ -15,7 +15,7 @@
<fullquery name="get_copy_objects">
<querytext>
select fs.object_id, fs.name, fs.parent_id,
select fs.object_id, fs.name, fs.title, fs.parent_id,
acs_permission.permission_p(fs.object_id, :user_id, 'read') as copy_p, fs.type
from fs_objects fs
where fs.object_id in ([template::util::tcl_to_sql_list $object_id])
......@@ -30,7 +30,9 @@
:object_id,
:folder_id,
:user_id,
:peer_addr);
:peer_addr,
:name,
:title);
end;
</querytext>
</fullquery>
......@@ -42,7 +44,9 @@
:object_id,
:folder_id,
:user_id,
:peer_addr );
:peer_addr,
:name,
:title);
end;
</querytext>
</fullquery>
......@@ -68,4 +72,4 @@
</querytext>
</fullquery>
</queryset>
\ No newline at end of file
</queryset>
<?xml version="1.0"?>
<!DOCTYPE queryset PUBLIC "-//OpenACS//DTD XQL 1.0//EN"
"http://www.thecodemill.biz/repository/xql.dtd">
<!DOCTYPE queryset PUBLIC "-//OpenACS//DTD XQL 1.0//EN" "http://www.thecodemill.biz/repository/xql.dtd">
<!-- @author Dave Bauer (dave@thedesignexperience.org) -->
<!-- @creation-date 2004-05-09 -->
......@@ -15,7 +14,7 @@
<fullquery name="get_copy_objects">
<querytext>
select fs.object_id, fs.name, fs.parent_id,
select fs.object_id, fs.name, fs.title, fs.parent_id,
acs_permission__permission_p(fs.object_id, :user_id, 'read') as copy_p, fs.type
from fs_objects fs
where fs.object_id in ([template::util::tcl_to_sql_list $object_id])
......@@ -29,7 +28,9 @@
:object_id,
:folder_id,
:user_id,
:peer_addr
:peer_addr,
:name,
:title
)
</querytext>
</fullquery>
......@@ -40,7 +41,9 @@
:object_id,
:folder_id,
:user_id,
:peer_addr
:peer_addr,
:name,
:title
)
</querytext>
</fullquery>
......@@ -48,18 +51,15 @@
<fullquery name="get_folder_tree">
<querytext>
select
cf.folder_id, ci1.parent_id, cf.label, tree_level(ci1.tree_sortkey) as level_num
from cr_folders cf, cr_items ci1, cr_items ci2
where
ci1.tree_sortkey between ci2.tree_sortkey and
tree_right(ci2.tree_sortkey)
and ci2.item_id=:root_folder_id
and ci1.item_id=cf.folder_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = cf.folder_id
and m.party_id = :user_id
and m.privilege = 'write')
cf.folder_id, ci1.parent_id, cf.label, tree_level(ci1.tree_sortkey) as level_num
from
cr_folders cf,
cr_items ci1,
cr_items ci2
where ci1.tree_sortkey between ci2.tree_sortkey and tree_right(ci2.tree_sortkey)
and ci2.item_id=:root_folder_id
and ci1.item_id=cf.folder_id
and acs_permission__permission_p(cf.folder_id, :user_id, 'write')
order by ci1.tree_sortkey, cf.label
</querytext>
</fullquery>
......@@ -69,13 +69,15 @@
<querytext>
With folder_tree as (
select
cf.folder_id, ci1.parent_id, cf.label, tree_level(ci1.tree_sortkey) as level_num, acs_permission__permission_p(cf.folder_id, :user_id, 'write') as permission_p
cf.folder_id, ci1.parent_id, cf.label,
tree_level(ci1.tree_sortkey) as level_num,
acs_permission__permission_p(cf.folder_id, :user_id, 'write') as permission_p
from cr_folders cf, cr_items ci1, cr_items ci2
where
ci1.tree_sortkey between ci2.tree_sortkey and
tree_right(ci2.tree_sortkey)
and ci2.item_id= :root_folder_id
and ci1.item_id=cf.folder_id
ci1.tree_sortkey between ci2.tree_sortkey and
tree_right(ci2.tree_sortkey)
and ci2.item_id= :root_folder_id
and ci1.item_id=cf.folder_id
order by ci1.tree_sortkey, cf.label
) select folder_id, parent_id, label, level_num from folder_tree where permission_p is true;
</querytext>
......
......@@ -9,8 +9,8 @@ ad_page_contract {
} -query {
object_id:notnull,integer,multiple
folder_id:naturalnum,optional
{return_url ""}
{root_folder_id ""}
{return_url:localurl ""}
{root_folder_id:integer ""}
{redirect_to_folder:boolean 0}
{show_items:boolean 0}
} -errors {object_id:,notnull,integer,multiple {Please select at least one item to copy.}
......@@ -37,7 +37,7 @@ db_multirow -extend {copy_message} copy_objects get_copy_objects "" {
}
if {$type eq "folder"} {
lappend not_allowed_children $object_id
lappend not_allowed_parents $parent_id
# lappend not_allowed_parents $parent_id
}
}
......@@ -58,23 +58,44 @@ if {[info exists folder_id]} {
# check for WRTIE permission on each object to be copyd
# DaveB: I think it should be DELETE instead of WRITE
# but the existing file-copy page checks for WRITE
set error_items [list]
set error_items [list]
template::multirow foreach copy_objects {
db_transaction {
# Allow to copy files into folders that already contain
# one with the same name by appending a numeric suffix
set suffix 1
set orig_title $title
set orig_name $name
while {[content::item::get_id_by_name \
-name $name \
-parent_id $folder_id] ne ""} {
set title ${orig_title}-${suffix}
# for name, put the suffix just before the extension,
# so browser can keep guessing the correct filetype at
# download
set name_ext [file extension $name]
set name [string range ${orig_name} 0 end-[string length $name_ext]]
set name ${name}-${suffix}${name_ext}
incr suffix
}
if {$type ne "folder" } {
set file_rev_id [db_exec_plsql copy_item {}]
callback fs::file_revision_new -package_id $package_id -file_id $object_id -parent_id $folder_id
callback fs::file_revision_new \
-package_id $package_id \
-file_id $object_id \
-parent_id $folder_id
} else {
db_exec_plsql copy_folder {}
}
} on_error {
lappend error_items $name
lappend error_items $name
}
}
if {[llength $error_items]} {
set message "There was a problem copying the following items: [join $error_items ", "]"
set message "[_ file-storage.There_was_a_problem_copying_the_following_items]: [join $error_items ", "]"
} else {
set message "Selected items copied."
set message [_ file-storage.Selected_items_have_been_copied]
}
ad_returnredirect -message $message $return_url
ad_script_abort
......
......@@ -3,7 +3,7 @@ ad_page_contract {
} {
object_id:multiple,naturalnum,notnull
{confirm_p:optional,boolean 0}
{return_url ""}
{return_url:localurl ""}
}
......
This diff is collapsed.
This diff is collapsed.
......@@ -20,26 +20,28 @@ information in any of these formats. Users should be able to
determine which individuals or groups should be allowed to read
particular items and who should be allowed to upload new
versions.</p>
<p>Since information is only useful if you can find what you're
<p>Since information is only useful if you can find what you&#39;re
looking for, files in the file storage system should be searchable,
both from within the application and through any site-wide search
facilities.</p>
<h3>III. System/Application Overview</h3>
<p>The File-Storage application will consist primarily of a user
interface that allows individuals to manage their file-storage
folder(s) and to see other people's publicly accessible files.</p>
folder(s) and to see other people&#39;s publicly accessible
files.</p>
<h3>IV. Use Case and User Scenarios</h3>
<h4>Using File-Storage to Run a Project</h4>
<p>In the course of her job at Acme Publishing Company, <b>Ursula
User</b> is working with people from several different offices with
whom she needs to exchange pictures and Excel spreadsheets
detailing cost estimates, and collaboratively write contracts using
Word. At any time, she and the other people she works with need to
be able to find the current copy of each of these documents - and
be able to look at older versions if need be to track the evolution
of the project. If the project is large, Ursula will also need to
be able to find all the documents pertaining to a particular issue
- so she will need a full-text search feature.</p>
<p>In the course of her job at Acme Publishing Company,
<strong>Ursula User</strong> is working with people from several
different offices with whom she needs to exchange pictures and
Excel spreadsheets detailing cost estimates, and collaboratively
write contracts using Word. At any time, she and the other people
she works with need to be able to find the current copy of each of
these documents - and be able to look at older versions if need be
to track the evolution of the project. If the project is large,
Ursula will also need to be able to find all the documents
pertaining to a particular issue - so she will need a full-text
search feature.</p>
<p>For each project, Ursula makes a folder on the file-storage
system and gives read, write, and edit permission to the group of
people she is working with for that project. Then she makes
......@@ -53,7 +55,7 @@ which they are satisfied. Occasionally, Ursula wants to ask someone
outside the group their opinion so she gives them read access to
just one version of a file so that they can download it and take a
look. Sometimes production tasks change; if so, Ursula can
rearrange the project's sub-folder hierarchy to make it more
rearrange the project&#39;s sub-folder hierarchy to make it more
closely reflect the new organizational scheme. When a project is
completed, if Ursula is considerate of the maintainers of the site
and of other users, she will clean-up after herself, downloading
......@@ -61,74 +63,78 @@ the canonical version of all the documents to her local machine and
deleting the files from the server.</p>
<h4>Administer File-Storage</h4>
<p>
<b>Annie Admin</b> primarily has the job of periodically
cleaning up after users. If disk space is tight on the server, she
may want to look for files that haven't been accessed in a long
time and either encourage the owners of those files to delete
anything they don't need on the server anymore or delete files
herself if the user can't be contacted or is unresponsive.
Depending on the precise permissions implementation, Annie may
occasionally need to intercede when the owner of a file
<strong>Annie Admin</strong> primarily has the job of
periodically cleaning up after users. If disk space is tight on the
server, she may want to look for files that haven&#39;t been
accessed in a long time and either encourage the owners of those
files to delete anything they don&#39;t need on the server anymore
or delete files herself if the user can&#39;t be contacted or is
unresponsive. Depending on the precise permissions implementation,
Annie may occasionally need to intercede when the owner of a file
accidentally revokes their own permission to access the file.</p>
<h3>V. Related Links</h3>
<ul>
<li><a href="design">Design Document</a></li><li><a href="index">System Overview Document</a></li>
</ul>
<h3>VI.A. Requirements: Data Model</h3>
<p><b>10 The Data Model</b></p>
<p><strong>10 The Data Model</strong></p>
<p>
<b>10.1</b> each file should have a unique identifier</p>
<p>
<b>10.2</b> each version of a file should have a unique
<strong>10.1</strong> each file should have a unique
identifier</p>
<p>
<b>10.3</b> each file should have an associated owner</p>
<strong>10.2</strong> each version of a file should have a
unique identifier</p>
<p>
<strong>10.3</strong> each file should have an associated
owner</p>
<p>
<b>10.4</b> each version should have an associated owner</p>
<strong>10.4</strong> each version should have an associated
owner</p>
<p>
<b>10.5</b> files will be organized in a hierarchical set of
folders</p>
<strong>10.5</strong> files will be organized in a hierarchical
set of folders</p>
<p>
<b>10.6</b> each version of each file will have individual read,
write, delete, comment, and administer permissions associated with
it</p>
<strong>10.6</strong> each version of each file will have
individual read, write, delete, comment, and administer permissions
associated with it</p>
<h3>VI.B. Requirements: Administrator Interface</h3>
<p><b>20 Administrator Interface</b></p>
<p><strong>20 Administrator Interface</strong></p>
<p>
<b>20.1</b> the administrator should be able to view all files
in the file-storage system</p>
<strong>20.1</strong> the administrator should be able to view
all files in the file-storage system</p>
<p>
<b>20.2</b> the administrator should be able to edit, delete, or
alter permissions for any file belonging to any user</p>
<strong>20.2</strong> the administrator should be able to edit,
delete, or alter permissions for any file belonging to any user</p>
<h3>VI.C. Requirements: User Interface</h3>
<p><b>30 User Interface</b></p>
<p><strong>30 User Interface</strong></p>
<p>
<b>30.1</b> a user should be able to create folders and
subfolders in which he can place his files</p>
<strong>30.1</strong> a user should be able to create folders
and subfolders in which he can place his files</p>
<p>
<b>30.2</b> a user should be able to add new files and new
versions of files</p>
<strong>30.2</strong> a user should be able to add new files and
new versions of files</p>
<p>
<b>30.3</b> a user should be able to move files to different
folders or sub-folders</p>
<strong>30.3</strong> a user should be able to move files to
different folders or sub-folders</p>
<p>
<b>30.4</b> a user should be able to delete folders and
individual files</p>
<strong>30.4</strong> a user should be able to delete folders
and individual files</p>
<p>
<b>30.5</b> a user should be able to specify permissions for any
user or group on any folder, file, or version.</p>
<strong>30.5</strong> a user should be able to specify
permissions for any user or group on any folder, file, or
version.</p>
<p>
<b>30.6</b> a user should be able to download any version which
is accessible to him</p>
<strong>30.6</strong> a user should be able to download any
version which is accessible to him</p>
<p>
<b>30.7</b> a user should be able to view and/or edit other
user's files if the user has been granted individual or group
permission with access to the files</p>
<strong>30.7</strong> a user should be able to view and/or edit
other user&#39;s files if the user has been granted individual or
group permission with access to the files</p>
<p>
<b>30.8</b> a user should be able to search the text of the
documents stored in the file-storage system (requires full-text
search capability from the database - in the case of Oracle,
requires InterMedia)</p>
<strong>30.8</strong> a user should be able to search the text
of the documents stored in the file-storage system (requires
full-text search capability from the database - in the case of
Oracle, requires InterMedia)</p>
<h3>VII. Revision History</h3>
<table cellpadding="2" cellspacing="2" width="90%" bgcolor="#EFEFEF">
<tr bgcolor="#E0E0E0">
......@@ -144,5 +150,5 @@ requires InterMedia)</p>
<hr>
<address><a href="mailto:kevin\@arsdigita.com">kevin\@arsdigita.com</a></address>
Last Modified: $&zwnj;Id: requirements.html,v 1.3 2005/05/26 08:28:46
maltes Exp $
Last Modified: $&zwnj;Id: requirements.html,v 1.3.10.1 2016/07/16
17:36:38 gustafn Exp $
......@@ -42,8 +42,8 @@ files.
<h4>Using File-Storage to Run a Project</h4>
<p>In the course of her job at Acme Publishing Company, <b>Ursula
User</b> is working with people from several different offices with
<p>In the course of her job at Acme Publishing Company, <strong>Ursula
User</strong> is working with people from several different offices with
whom she needs to exchange pictures and Excel spreadsheets detailing
cost estimates, and collaboratively write contracts using Word. At any
time, she and the other people she works with need to be able to find
......@@ -74,7 +74,7 @@ local machine and deleting the files from the server.
<h4>Administer File-Storage</h4>
<p><b>Annie Admin</b> primarily has the job of periodically cleaning
<p><strong>Annie Admin</strong> primarily has the job of periodically cleaning
up after users. If disk space is tight on the server, she may want to
look for files that haven't been accessed in a long time and either
encourage the owners of those files to delete anything they don't need
......@@ -93,50 +93,50 @@ the file.
<h3>VI.A. Requirements: Data Model</h3>
<p><b>10 The Data Model</b>
<p><b>10.1</b> each file should have a unique identifier
<p><b>10.2</b> each version of a file should have a unique identifier
<p><b>10.3</b> each file should have an associated owner
<p><b>10.4</b> each version should have an associated owner
<p><b>10.5</b> files will be organized in a hierarchical set of folders
<p><b>10.6</b> each version of each file will have individual
<p><strong>10 The Data Model</strong>
<p><strong>10.1</strong> each file should have a unique identifier
<p><strong>10.2</strong> each version of a file should have a unique identifier
<p><strong>10.3</strong> each file should have an associated owner
<p><strong>10.4</strong> each version should have an associated owner
<p><strong>10.5</strong> files will be organized in a hierarchical set of folders
<p><strong>10.6</strong> each version of each file will have individual
read, write, delete, comment, and administer permissions associated with it
<h3>VI.B. Requirements: Administrator Interface</h3>
<p><b>20 Administrator Interface</b>
<p><b>20.1</b> the administrator should be able to view all files in
<p><strong>20 Administrator Interface</strong>
<p><strong>20.1</strong> the administrator should be able to view all files in
the file-storage system
<p><b>20.2</b> the administrator should be able to edit,
<p><strong>20.2</strong> the administrator should be able to edit,
delete, or alter permissions for any file belonging to any user
<h3>VI.C. Requirements: User Interface</h3>
<p><b>30 User Interface</b>
<p><b>30.1</b> a user should be able to create folders and subfolders
<p><strong>30 User Interface</strong>
<p><strong>30.1</strong> a user should be able to create folders and subfolders
in which he can place his files
<p><b>30.2</b> a user should be able to add new files and new versions
<p><strong>30.2</strong> a user should be able to add new files and new versions
of files
<p><b>30.3</b> a user should be able to move files to different
<p><strong>30.3</strong> a user should be able to move files to different
folders or sub-folders
<p><b>30.4</b> a user should be able to delete folders and individual
<p><strong>30.4</strong> a user should be able to delete folders and individual
files
<p><b>30.5</b> a user should be able to specify permissions for any user or group on any folder, file, or version.
<p><b>30.6</b> a user should be able to download any version which is accessible to him
<p><b>30.7</b> a user should be able to view and/or edit other user's files
<p><strong>30.5</strong> a user should be able to specify permissions for any user or group on any folder, file, or version.
<p><strong>30.6</strong> a user should be able to download any version which is accessible to him
<p><strong>30.7</strong> a user should be able to view and/or edit other user's files
if the user has been granted
individual or group permission with access to the files
<p><b>30.8</b> a user should be able to search the text of the
<p><strong>30.8</strong> a user should be able to search the text of the
documents stored in the file-storage system (requires full-text search
capability from the database - in the case of Oracle, requires InterMedia)
<h3>VII. Revision History</h3>
<table cellpadding=2 cellspacing=2 width=90% bgcolor=#efefef>
<tr bgcolor=#e0e0e0>
<th width=10%>Document Revision #</th>
<th width=50%>Action Taken, Notes</th>
<table cellpadding="2" cellspacing="2" width="90%" bgcolor="#efefef">
<tr bgcolor="#e0e0e0">
<th width="10%">Document Revision #</th>
<th width="50%">Action Taken, Notes</th>
<th>When?</th>
<th>By Whom?</th>
</tr>
......
......@@ -71,3 +71,9 @@ ns_returnfile 200 application/octet-stream $out_file
# clean everything up
file delete -force $in_path
file delete -force $out_path
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -3,7 +3,7 @@ ad_page_contract {
} {
object_id:naturalnum,notnull,multiple
{confirm_p:optional,boolean 0}
{return_url ""}
{return_url:localurl ""}
} -errors {object_id:,notnull,integer,multiple {Please select at least one item to download.}
}
......@@ -23,12 +23,12 @@ if {[llength $object_id] == 1} {
append download_name ".zip"
foreach fs_object_id $object_id {
# The minimal requirment is that the object exists. Don't throw
# The minimal requirement is that the object exists. Don't throw
# hard errors on following outdated links. We could test for
# supported object_types.
if {![acs_object::object_p -id $fs_object_id]} {
ns_returnnotfound
file delete -force $in_path
file delete -force -- $in_path
ad_script_abort
}
set file [fs::publish_object_to_file_system -object_id $fs_object_id -path $in_path -user_id $user_id]
......@@ -45,8 +45,8 @@ with_catch errmsg {
util::zip -source $in_path -destination $out_file
} {
# some day we'll do something useful here
file delete -force $in_path
file delete -force $out_path
file delete -force -- $in_path
file delete -force -- $out_path
error $errmsg
}
......@@ -57,8 +57,8 @@ ns_set put [ad_conn outputheaders] Content-Size "[file size $out_file]"
ns_returnfile 200 application/octet-stream $out_file
# clean everything up
file delete -force $in_path
file delete -force $out_path
file delete -force -- $in_path
file delete -force -- $out_path
# Local variables:
# mode: tcl
......
......@@ -34,3 +34,9 @@ if {[apm_package_installed_p views]} {
}
cr_write_content -revision_id $version_id
# Local variables:
# mode: tcl
# tcl-indent-level: 4
# indent-tabs-mode: nil
# End:
......@@ -4,27 +4,6 @@
<h1>#file-storage.Upload_New_File#</h1>
<if @unpack_available_p@ true>
<script type="text/javascript">
function UnpackChanged(elm) {
var form_name = "file-add";
if (elm == null) return;
if (document.forms == null) return;
if (document.forms[form_name] == null) return;
if (elm.checked == true) {
document.forms[form_name].elements["title"].disabled = true;
document.getElementById('fs_title_msg').innerHTML= 'The title you entered will not be used if you upload multiple files at once';
} else {
document.forms[form_name].elements["title"].disabled = false;
document.getElementById('fs_title_msg').innerHTML= '';
}
}
</script>
</if>
<p>
@instructions;noquote@
</p>
......
......@@ -8,7 +8,7 @@ ad_page_contract {
file_id:naturalnum,optional,notnull
folder_id:naturalnum,optional,notnull
upload_file:trim,optional
return_url:optional
return_url:localurl,optional
upload_file.tmpfile:tmpfile,optional
content_body:optional
{title ""}
......@@ -30,7 +30,7 @@ ad_page_contract {
return
}
}
if {![fs_folder_p $folder_id]} {
if {![info exists folder_id] || ![fs_folder_p $folder_id]} {
ad_complain "The specified parent folder is not valid."
}
}
......@@ -64,14 +64,16 @@ if {![ad_form_new_p -key file_id]} {
set context [fs_context_bar_list -final "[_ file-storage.Add_File]" $folder_id]
}
ad_form -html { enctype multipart/form-data } -export { folder_id lock_title_p name } -form {
file_id:key
{upload_file:file {label \#file-storage.Upload_a_file\#} {html "size 30"}}
}
ad_form -html { enctype multipart/form-data } \
-export { folder_id lock_title_p name } \
-form {
file_id:key
{upload_file:file {label \#file-storage.Upload_a_file\#} {html "size 30"}}
}
if {[parameter::get -parameter AllowTextEdit -default 0]} {
if {[ad_form_new_p -key file_id]} {
# To allow the creation of files
ad_form -extend -form {
{content_body:richtext(richtext),optional
......@@ -83,7 +85,9 @@ if {[parameter::get -parameter AllowTextEdit -default 0]} {
} else {
# To make content editable
set revision_id [content::item::get_live_revision -item_id $file_id]
set mime_type [db_string get_mime_type "select mime_type from cr_revisions where revision_id = :revision_id"]
set mime_type [db_string get_mime_type {
select mime_type from cr_revisions where revision_id = :revision_id
}]
if {$mime_type eq "text/html"} {
ad_form -extend -form {
{edit_content:richtext(richtext),optional
......@@ -110,61 +114,67 @@ if {$lock_title_p} {
{title:text(hidden) {value $title}}
}
} else {
ad_form -extend -form {
ad_form -extend -form {
{title:text,optional {label \#file-storage.Title\#} {html {size 30}} }
}
}
ad_form -extend -form {
{description:text(textarea),optional {label \#file-storage.Description\#} {html "rows 5 cols 35"}}
}
if [catch {set binary [im_exec $unpack_binary]} errormsg] {
set unpack_bin_installed 0
if {[catch {set binary [exec $unpack_binary]} errormsg]} {
set unpack_bin_installed 0
} else {
set unpack_bin_installed 1
set unpack_bin_installed 1
}
if {([ad_form_new_p -key file_id]) && $unpack_bin_installed } {
if {[ad_form_new_p -key file_id] && $unpack_bin_installed } {
ad_form -extend -form {
{unpack_p:boolean(checkbox),optional {label \#file-storage.Multiple_files\#} {html {onclick "javascript:UnpackChanged(this);"}} {options { {\#file-storage.lt_This_is_a_ZIP\# t} }} }
{unpack_p:boolean(checkbox),optional \
{label \#file-storage.Multiple_files\#} \
{options { {\#file-storage.lt_This_is_a_ZIP\# t} }}
}
}
}
if { [parameter::get -parameter CategoriesP -package_id $package_id -default 0] } {
if { ([info exists file_id] && $file_id ne "") } {
set categorized_object_id $file_id
} else {
# pre-populate with categories from the folder
set categorized_object_id $folder_id
}
if { [info exists file_id] && $file_id ne "" } {
set categorized_object_id $file_id
} else {
# pre-populate with categories from the folder
set categorized_object_id $folder_id
}
category::ad_form::add_widgets \
-container_object_id $package_id \
-categorized_object_id $categorized_object_id \
-form_name file-add
-container_object_id $package_id \
-categorized_object_id $categorized_object_id \
-form_name file-add
}
ad_form -extend -form {} -select_query_name {get_file} -new_data {
ad_form -extend -form {} -select_query_name get_file -new_data {
if {(![info exists unpack_p] || $unpack_p eq "")} {
set unpack_p f
}
if { $unpack_p && $unpack_binary ne "" && [file extension [template::util::file::get_property filename $upload_file]] eq ".zip" } {
if {![info exists unpack_p] || $unpack_p eq ""} {
set unpack_p f
}
if { $unpack_p
&& $unpack_binary ne ""
&& [file extension [template::util::file::get_property filename $upload_file]] eq ".zip"
} {
set path [ad_tmpnam]
file mkdir $path
set path [ad_tmpnam]
file mkdir $path
catch { im_exec $unpack_binary -jd $path ${upload_file.tmpfile} } errmsg
catch { exec $unpack_binary -jd $path ${upload_file.tmpfile} } errmsg
# More flexible parameter design could be:
# zip {unzip -jd {out_path} {in_file}} tar {tar xf {in_file} {out_path}} tgz {tar xzf {in_file} {out_path}}
# More flexible parameter design could be:
# zip {unzip -jd {out_path} {in_file}} tar {tar xf {in_file} {out_path}} tgz {tar xzf {in_file} {out_path}}
set upload_files [list]
set upload_tmpfiles [list]
set upload_files [list]
set upload_tmpfiles [list]
foreach file [glob -nocomplain "$path/*"] {
lappend upload_files [file tail $file]
foreach file [glob -nocomplain "$path/*"] {
lappend upload_files [file tail $file]
lappend upload_tmpfiles $file
}
......@@ -247,20 +257,20 @@ ad_form -extend -form {} -select_query_name {get_file} -new_data {
-element_name category_id]
}
file delete $tmpfile
file delete -- $tmpfile
incr i
if {$i < $number_upload_files} {
set file_id [db_nextval "acs_object_id_seq"]
}
}
file delete $upload_file.tmpfile
file delete -- $upload_file.tmpfile
} -edit_data {
set this_title $title
set filename [template::util::file::get_property filename $upload_file]
if {$this_title eq ""} {
set this_title $filename
}
fs::add_version \
-name $filename \
-tmp_filename [template::util::file::get_property tmp_filename $upload_file] \
......@@ -270,7 +280,7 @@ ad_form -extend -form {} -select_query_name {get_file} -new_data {
-title $this_title \
-description $description \
-package_id $package_id
if { [parameter::get -parameter CategoriesP -package_id $package_id -default 0] } {
category::map_object -remove_old -object_id $file_id [category::ad_form::get_categories \
-container_object_id $package_id \
......@@ -278,7 +288,7 @@ ad_form -extend -form {} -select_query_name {get_file} -new_data {
}
} -after_submit {
if {([info exists return_url] && $return_url ne "")} {
if {[info exists return_url] && $return_url ne ""} {
ad_returnredirect $return_url
} else {
ad_returnredirect [export_vars -base ./ {folder_id}]
......@@ -293,12 +303,36 @@ if {$title eq ""} {
}
if { [parameter::get -parameter "BehaveLikeFilesystemP" -package_id [ad_conn package_id]] } {
set instructions "[_ file-storage.Add_Dup_As_Revision]"
set instructions [_ file-storage.Add_Dup_As_Revision]
} else {
set instructions "[_ file-storage.Add_Dup_As_New_File]"
set instructions [_ file-storage.Add_Dup_As_New_File]
}
set unpack_available_p [expr {[string trim [parameter::get -parameter UnzipBinary]] ne ""}]
if {$unpack_available_p} {
template::add_body_script -script {
function UnpackChanged(elm) {
var form_name = "file-add";
if (elm == null) return;
if (document.forms == null) return;
if (document.forms[form_name] == null) return;
if (elm.checked == true) {
document.forms[form_name].elements["title"].disabled = true;
//document.getElementById('fs_title_msg').innerHTML= 'The title you entered will not be used if you upload multiple files at once';
} else {
document.forms[form_name].elements["title"].disabled = false;
//document.getElementById('fs_title_msg').innerHTML= '';
}
};
document.getElementById('file-add:elements:unpack_p:t').addEventListener('click', function (event) {
UnpackChanged(this);
}, false);
}
}
ad_return_template
......
<?xml version="1.0"?>
<queryset>
<fullquery name="get_folder_id">
<querytext>
select parent_id as folder_id from cr_items where item_id=:file_id
</querytext>
</fullquery>
<fullquery name="get_file">
<querytext>
......
......@@ -2,20 +2,6 @@
<queryset>
<rdbms><type>oracle</type><version>8.1.6</version></rdbms>
<fullquery name="rename_file">
<querytext>
begin
file_storage.rename_file (
file_id => :file_id,
title => :title
);
end;
</querytext>
</fullquery>
<fullquery name="duplicate_check">
<querytext>
......
......@@ -3,18 +3,6 @@
<queryset>
<rdbms><type>postgresql</type><version>7.1</version></rdbms>
<fullquery name="rename_file">
<querytext>
select file_storage__rename_file (
:file_id, -- file_id
:title -- title
);
</querytext>
</fullquery>
<fullquery name="duplicate_check">
<querytext>
......
......@@ -26,10 +26,9 @@ permission::require_permission -object_id $file_id -privilege write
set context [fs_context_bar_list -final "[_ file-storage.Rename]" $file_id]
# Variable title used by message lookup
db_1row file_info ""
db_1row file_info {}
set page_title [_ file-storage.file_edit_page_title]
set title_help [_ file-storage.lt_Please_enter_the_new_]
ad_form -export file_id -form {
......
......@@ -45,12 +45,9 @@
where o.object_id = r.revision_id
and r.item_id = i.item_id
and r.item_id = :file_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = r.revision_id
and m.party_id = :user_id
and m.privilege = 'read')
$show_versions order by last_modified desc
and acs_permission__permission_p(r.revision_id, :user_id, 'read')
$show_versions order by last_modified desc
</querytext>
</fullquery>
......
......@@ -6,7 +6,7 @@ ad_page_contract {
} {
folder_id:naturalnum,notnull
cancel_url
return_url
return_url:localurl
}
set package_id [ad_conn package_id]
......
......@@ -8,14 +8,14 @@
<div class="list-button-bar-top">
<a href="@folder_view_url@" class="button" title="#file-storage.back_to_folder_view#">#file-storage.back_to_folder_view#</a>
<if @show_all_versions_p@ true>
<if @show_all_versions_p;literal@ true>
<a href="@show_versions_url@" class="button" title="#file-storage.lt_show_only_live_versio#">#file-storage.lt_show_only_live_versio#</a>
</if>
<else>
<a href="@show_versions_url@" class="button" title="#file-storage.show_all_versions#">#file-storage.show_all_versions#</a>
</else>
</div>
<if @categories_p@><if @category_links@><p>#file-storage.Categories#: @category_links;noquote@</p></if></if>
<if @categories_p;literal@ true><if @category_links@><p>#file-storage.Categories#: @category_links;noquote@</p></if></if>
<listtemplate name="version"></listtemplate>
<if @gc_comments@ not nil>
<p>#file-storage.lt_Comments_on_this_file#</p>
......
......@@ -6,7 +6,7 @@ ad_page_contract {
@cvs-id $Id$
} {
file_id:naturalnum,notnull
{show_all_versions_p:boolean "f"}
{show_all_versions_p:boolean,notnull "f"}
} -validate {
valid_file -requires {file_id} {
if {![fs_file_p $file_id]} {
......@@ -37,7 +37,8 @@ set root_folder_id [fs::get_root_folder]
db_1row file_info ""
# get folder id so we can implement a back link
set folder_id [db_string get_folder ""]
set folder_id [db_string get_folder {}]
set folder_write_p [permission::permission_p -object_id $folder_id -privilege write]
set folder_view_url [export_vars -base index {folder_id}]
......@@ -60,20 +61,47 @@ if { $categories_p } {
set rename_name [_ file-storage.Rename_File]
}
set actions [list \
[_ file-storage.Upload_Revision] [export_vars -base file-add {file_id return_url}] "Upload a new version of this file" \
$rename_name [export_vars -base file-edit file_id] "Rename file" \
[_ file-storage.Copy_File] [export_vars -base copy {{object_id $file_id} return_url}] "Copy file" \
[_ file-storage.Move_File] [export_vars -base move {{object_id $file_id} {return_url $folder_view_url}}] "Move file" \
[_ file-storage.Delete_File] [export_vars -base delete {{object_id $file_id} {return_url $folder_view_url}}] "Delete file"]
if {$delete_p == "t"} {
set actions {}
if {$write_p} {
lappend actions \
[_ file-storage.Upload_Revision] \
[export_vars -base file-add {file_id return_url}] \
"Upload a new version of this file" \
$rename_name \
[export_vars -base file-edit file_id] \
"Rename file"
}
# add button only when available folders for copy exist. We settle for
# a lazy check on write permissions for folder because a rigorous
# check of available destinations would not be performant.
if {$folder_write_p} {
lappend actions \
[_ file-storage.Copy_File] \
[export_vars -base copy {{object_id $file_id} return_url}] \
"Copy file"
}
if {$delete_p} {
# add button only when available folders for move exist. We
# lazily check for deletion, as a proper check of a suitable
# destination for moving would be too much effort
lappend actions \
[_ file-storage.Move_File] \
[export_vars -base move {{object_id $file_id} {return_url $folder_view_url}}] \
"Move file"
lappend actions \
[_ file-storage.Set_Permissions] \
[export_vars -base permissions {{object_id $file_id}}] \
[_ file-storage.lt_Modify_permissions_on]
[_ file-storage.Delete_File] \
[export_vars -base delete {{object_id $file_id} {return_url $folder_view_url}}] \
"Delete file" \
[_ file-storage.Set_Permissions] \
[export_vars -base permissions {{object_id $file_id}}] \
[_ file-storage.lt_Modify_permissions_on]
}
template::list::create \
-name version \
-no_data [_ file-storage.lt_There_are_no_versions] \
......@@ -124,8 +152,10 @@ db_multirow -unclobber -extend { author_link last_modified_pretty content_size_p
} else {
set version_url [export_vars -base "download/$title" {file_id}]
}
set version_delete [_ file-storage.Delete_Version]
set version_delete_url [export_vars -base version-delete version_id]
if {$delete_p} {
set version_delete [_ file-storage.Delete_Version]
set version_delete_url [export_vars -base version-delete version_id]
}
set author_link [acs_community_member_link -user_id $author_id -label $author]
}
......
......@@ -7,7 +7,7 @@ ad_page_contract {
} {
folder_id:naturalnum,optional,notnull
upload_folder:trim,optional
return_url:optional
return_url:localurl,optional
{lock_title_p:boolean 0}
} -properties {
......
......@@ -30,13 +30,10 @@
end as new_p
from fs_objects
where fs_objects.parent_id = :folder_id
and exists (select 1
from acs_object_party_privilege_map m
where m.object_id = fs_objects.object_id
and m.party_id = :viewing_user_id
and m.privilege = 'read')
$categories_limitation
$orderby
and acs_permission__permission_p(fs_objects.object_id, :viewing_user_id, 'read')
$categories_limitation
$orderby
</querytext>
</fullquery>
......
<if @categories_p@>
<if @categories_p;literal@ true>
<if @category_links@>
<p>#file-storage.Categories#: @category_links;noquote@</p>
</if>
......
......@@ -5,7 +5,7 @@ ad_page_contract {
@creation-date Feb 22, 2002
@cvs-id $Id$
} -query {
{orderby:optional}
{orderby:token,optional}
} -properties {
folder_name:onevalue
contents:multirow
......@@ -13,14 +13,14 @@ ad_page_contract {
page_num
}
if {(![info exists folder_id] || $folder_id eq "")} {
if {![info exists folder_id] || $folder_id eq ""} {
ad_return_complaint 1 [_ file-storage.lt_bad_folder_id_folder_]
ad_script_abort
}
if {(![info exists allow_bulk_actions] || $allow_bulk_actions eq "")} {
if {![info exists allow_bulk_actions] || $allow_bulk_actions eq ""} {
set allow_bulk_actions "0"
}
if { (![info exists category_id] || $category_id eq "") } {
if { ![info exists category_id] || $category_id eq "" } {
set category_id ""
}
set viewing_user_id [ad_conn user_id]
......@@ -38,11 +38,11 @@ if {!$delete_p} {
set delete_p [permission::permission_p -party_id $viewing_user_id -object_id $folder_id -privilege "delete"]
}
if {(![info exists n_past_days] || $n_past_days eq "")} {
if {![info exists n_past_days] || $n_past_days eq ""} {
set n_past_days 99999
}
if {(![info exists fs_url] || $fs_url eq "")} {
if {![info exists fs_url] || $fs_url eq ""} {
set fs_url [ad_conn package_url]
}
......@@ -50,7 +50,7 @@ set folder_name [lang::util::localize [fs::get_object_name -object_id $folder_i
set content_size_total 0
if {(![info exists format] || $format eq "")} {
if {![info exists format] || $format eq ""} {
set format table
}
......@@ -76,18 +76,20 @@ set actions [list]
set cancel_url "[ad_conn url]?[ad_conn query]"
set add_url [export_vars -base "${fs_url}file-add" {folder_id}]
lappend actions "#file-storage.Add_File#" \
[export_vars -base "${fs_url}file-upload-confirm" {folder_id cancel_url {return_url $add_url}}] \
[_ file-storage.lt_Upload_a_file_in_this] \
"#file-storage.Create_a_URL#" \
[export_vars -base "${fs_url}simple-add" {folder_id}] \
[_ file-storage.lt_Add_a_link_to_a_web_p] \
"#file-storage.New_Folder#" \
[export_vars -base "${fs_url}folder-create" {{parent_id $folder_id}}] \
"#file-storage.Create_a_new_folder#" \
[_ file-storage.lt_Upload_compressed_fol] \
[export_vars -base "${fs_url}folder-zip-add" {folder_id}] \
[_ file-storage.lt_Upload_a_compressed_f]
if {$write_p} {
lappend actions "#file-storage.Add_File#" \
[export_vars -base "${fs_url}file-upload-confirm" {folder_id cancel_url {return_url $add_url}}] \
[_ file-storage.lt_Upload_a_file_in_this] \
"#file-storage.Create_a_URL#" \
[export_vars -base "${fs_url}simple-add" {folder_id}] \
[_ file-storage.lt_Add_a_link_to_a_web_p] \
"#file-storage.New_Folder#" \
[export_vars -base "${fs_url}folder-create" {{parent_id $folder_id}}] \
"#file-storage.Create_a_new_folder#" \
[_ file-storage.lt_Upload_compressed_fol] \
[export_vars -base "${fs_url}folder-zip-add" {folder_id}] \
[_ file-storage.lt_Upload_a_compressed_f]
}
set expose_rss_p [parameter::get -parameter ExposeRssP -package_id $package_id -default 0]
set like_filesystem_p [parameter::get -parameter BehaveLikeFilesystemP -package_id $package_id -default 1]
......@@ -106,11 +108,14 @@ if {$delete_p} {
"#file-storage.Delete_this_folder#"
}
if {$admin_p} {
if { $root_folder_id ne $folder_id } {
lappend actions \
"#file-storage.Edit_Folder#" \
[export_vars -base "${fs_url}folder-edit" {folder_id}] \
"#file-storage.Rename_this_folder#"
}
lappend actions \
"#file-storage.Edit_Folder#" \
[export_vars -base "${fs_url}folder-edit" {folder_id}] \
"#file-storage.Rename_this_folder#" \
"#file-storage.lt_Modify_permissions_on_1#" \
"#file-storage.lt_Modify_permissions_on_1#" \
[export_vars -base "${fs_url}permissions" -override {{object_id $folder_id}} {{return_url "[ad_conn url]"}}] \
"#file-storage.lt_Modify_permissions_on_1#"
if { $expose_rss_p } {
......@@ -132,7 +137,7 @@ if { $categories_p } {
set elements [list \
type \
[list label [_ file-storage.Type] \
display_template {<img src="@contents.icon@" style="border: 0;" alt="@contents.alt_icon@">@contents.pretty_type@} \
display_template {<img src="@contents.icon@" style="border: 0;" alt="@contents.alt_icon@" width="16" height="16">@contents.pretty_type@} \
orderby_desc {sort_key_desc,fs_objects.pretty_type desc} \
orderby_asc {fs_objects.sort_key, fs_objects.pretty_type asc}] \
name \
......@@ -181,32 +186,53 @@ if {[apm_package_installed_p views]} {
concat $elements [list views [list label "Views"]]
}
if {(![info exists return_url] || $return_url eq "")} {
if {![info exists return_url] || $return_url eq ""} {
set return_url [export_vars -base "index" {folder_id}]
}
set vars_to_export [list return_url]
set bulk_actions {}
if {$allow_bulk_actions} {
set bulk_actions [list [_ file-storage.Move] \
${fs_url}move \
[_ file-storage.lt_Move_Checked_Items_to] \
[_ file-storage.Copy] \
${fs_url}copy \
[_ file-storage.lt_Copy_Checked_Items_to] \
[_ file-storage.Delete] \
${fs_url}delete \
[_ file-storage.Delete_Checked_Items] \
[_ file-storage.Download_ZIP] \
${fs_url}download-zip \
[_ file-storage.Download_ZIP_Checked_Items]]
set user_id [ad_conn user_id]
set bulk_delete_p [db_string some_deletables {
select exists (select 1 from fs_objects
where parent_id = :folder_id
and acs_permission__permission_p(object_id, :viewing_user_id, 'delete'))
}]
set bulk_copy_p [permission::permission_p -object_id $folder_id -privilege write]
# add button only when available folders for move exist. We
# lazily check for deletion, as a proper check of a suitable
# destination for moving would be too much effort
if {$bulk_delete_p} {
lappend bulk_actions \
[_ file-storage.Move] ${fs_url}move [_ file-storage.lt_Move_Checked_Items_to]
}
# add button only when available folders for copy exist. We settle for
# a lazy check on write permissions for folder because a rigorous
# check of available destinations would not be performant.
if {$bulk_copy_p} {
lappend bulk_actions \
[_ file-storage.Copy] ${fs_url}copy [_ file-storage.lt_Copy_Checked_Items_to]
}
if {$bulk_delete_p} {
lappend bulk_actions \
[_ file-storage.Delete] ${fs_url}delete [_ file-storage.Delete_Checked_Items]
}
lappend bulk_actions \
[_ file-storage.Download_ZIP] ${fs_url}download-zip [_ file-storage.Download_ZIP_Checked_Items]
callback fs::folder_chunk::add_bulk_actions \
-bulk_variable "bulk_actions" \
-folder_id $folder_id \
-var_export_list "vars_to_export"
} else {
set bulk_actions ""
}
if {$format eq "list"} {
set actions {}
}
......@@ -274,8 +300,6 @@ db_multirow \
}
set file_upload_name [fs::remove_special_file_system_characters -string $file_upload_name]
if { $content_size ne "" } {
incr content_size_total $content_size
}
......@@ -353,8 +377,11 @@ db_multirow \
default {
set properties_link [_ file-storage.properties]
set properties_url [export_vars -base ${fs_url}file {{file_id $object_id}}]
set new_version_link [_ acs-kernel.common_New]
set new_version_url [export_vars -base ${fs_url}file-add {{file_id $object_id}}]
if { [permission::permission_p \
-object_id $object_id -privilege "write"] } {
set new_version_link [_ acs-kernel.common_New]
set new_version_url [export_vars -base ${fs_url}file-add {{file_id $object_id}}]
}
set icon "/resources/file-storage/file.gif"
set alt_icon "#file-storage.file#"
set download_link [_ file-storage.Download]
......
This diff is collapsed.
......@@ -2,7 +2,7 @@
<property name="doc(title)">@page_title;literal@</property>
<property name="context">@context;literal@</property>
<if @blocked_p@ eq "t">
<if @blocked_p;literal@ true>
<p>#file-storage.lt_This_folder_contains_#
......
......@@ -37,9 +37,8 @@ permission::require_permission -object_id $folder_id -privilege delete
# contents at all.)
set blocked_p [ad_decode [children_have_permission_p $folder_id delete] 0 t f]
set folder_name [db_string folder_name ""]
set child_count [db_string child_count ""]
set folder_name [db_string folder_name {}]
set child_count [db_string child_count {}]
# TODO add child_count to message key
......@@ -87,9 +86,13 @@ if { $confirmed_p == "t" && $blocked_p == "f" } {
} else {
# they still need to confirm
set folder_name [db_string folder_name "
select label from cr_folders where folder_id = :folder_id"]
set child_count [db_string child_count "select count(ci.item_id) from (select item_id from cr_items connect by prior item_id=parent_id start with item_id=:folder_id) ci"]
set folder_name [db_string folder_name {
select label from cr_folders where folder_id = :folder_id
}]
set child_count [db_string child_count {
select count(ci.item_id) from
(select item_id from cr_items connect by prior item_id=parent_id start with item_id=:folder_id) ci
}]
set context [fs_context_bar_list -final "[_ file-storage.Delete]" $folder_id]
}
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -4,4 +4,4 @@
<h1>@page_title;noquote@ - #file-storage.Permissions#</h1>
<include src="/packages/acs-subsite/www/permissions/perm-include" object_id="@object_id;literal@" />
<include src="/packages/acs-subsite/www/permissions/perm-include" &="object_id" &="return_url">
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment