Template
1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo synced 2024-11-21 17:34:24 +01:00

Compare commits

..

30 commits

Author SHA1 Message Date
Edgarsons 0094528a78
i18n: translated using Weblate (Latvian)
Currently translated at 72.3% (2648 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
2024-11-20 15:45:26 +00:00
Atul_Eterno 2c5d3f3c29
i18n: translated using Weblate (Spanish)
Currently translated at 84.5% (3094 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/es/
2024-11-20 15:45:26 +00:00
Fjuro cd1ddd31cf
i18n: translated using Weblate (Czech)
Currently translated at 100.0% (3658 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/
2024-11-20 15:45:26 +00:00
Benedikt Straub 1536d47990
i18n: translated using Weblate (German (Low))
Currently translated at 100.0% (3658 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/nds/
2024-11-20 15:45:26 +00:00
SomeTr ab1bbb8bff
i18n: translated using Weblate (Ukrainian)
Currently translated at 74.6% (2731 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:26 +00:00
0ko ef497352f7
i18n: translated using Weblate (Russian)
Currently translated at 100.0% (3658 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ru/
2024-11-20 15:45:26 +00:00
Edgarsons eda9298adf
i18n: translated using Weblate (Latvian)
Currently translated at 72.2% (2644 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
2024-11-20 15:45:26 +00:00
Fjuro 3b7a56fce5
i18n: translated using Weblate (Czech)
Currently translated at 100.0% (3658 of 3658 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/cs/
2024-11-20 15:45:26 +00:00
SomeTr d9a9c2db66
i18n: translated using Weblate (Ukrainian)
Currently translated at 74.6% (2727 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:26 +00:00
SomeTr 6de1ce7d9c
i18n: translated using Weblate (Ukrainian)
Currently translated at 74.5% (2723 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:26 +00:00
SomeTr e4d2614824
i18n: translated using Weblate (Ukrainian)
Currently translated at 74.4% (2721 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:26 +00:00
SomeTr b352954b7a
i18n: translated using Weblate (Ukrainian)
Currently translated at 74.2% (2715 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
SomeTr 5cd42dffdb
i18n: translated using Weblate (Ukrainian)
Currently translated at 73.4% (2684 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
SomeTr e0de2974a0
i18n: translated using Weblate (Ukrainian)
Currently translated at 73.3% (2680 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
artnay 34a760b04f
i18n: translated using Weblate (Finnish)
Currently translated at 57.2% (2094 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/
2024-11-20 15:45:25 +00:00
xtex aa9ed29fbe
i18n: translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (3655 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/
2024-11-20 15:45:25 +00:00
SomeTr c99833bfd8
i18n: translated using Weblate (Ukrainian)
Currently translated at 73.2% (2676 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
artnay 07f341c2b5
i18n: translated using Weblate (Finnish)
Currently translated at 56.3% (2059 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/
2024-11-20 15:45:25 +00:00
SomeTr 2e5fbb9c9f
i18n: translated using Weblate (Ukrainian)
Currently translated at 73.1% (2675 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
artnay 4ed2844fde
i18n: translated using Weblate (Finnish)
Currently translated at 55.8% (2040 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/fi/
2024-11-20 15:45:25 +00:00
SomeTr 19560047aa
i18n: translated using Weblate (Ukrainian)
Currently translated at 72.8% (2661 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/uk/
2024-11-20 15:45:25 +00:00
xtex f1ac1e50a5
i18n: translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (3655 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/
2024-11-20 15:45:25 +00:00
xtex ef61385da2
i18n: translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (3655 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/
2024-11-20 15:45:25 +00:00
Edgarsons 2a5fad676d
i18n: translated using Weblate (Latvian)
Currently translated at 72.3% (2644 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
2024-11-20 15:45:25 +00:00
xtex 05be8ddfa5
i18n: translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (3655 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/zh_Hans/
2024-11-20 15:45:25 +00:00
Edgarsons 15b49be879
i18n: translated using Weblate (Latvian)
Currently translated at 71.9% (2628 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/lv/
2024-11-20 15:45:25 +00:00
yumechi 46a7459e6e
i18n: translated using Weblate (Japanese)
Currently translated at 91.7% (3353 of 3655 strings)

Translation: Forgejo/forgejo
Translate-URL: https://translate.codeberg.org/projects/forgejo/forgejo/ja/
2024-11-20 15:45:25 +00:00
Earl Warren 7015bdfa48 Merge pull request 'chore(ci): remove unused experimental DNS updates' (#6034) from earl-warren/forgejo:wip-dns-update into forgejo
Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/6034
Reviewed-by: Michael Kriese <michael.kriese@gmx.de>
2024-11-20 15:45:12 +00:00
Earl Warren a69943085a
chore(ci): remove unused experimental DNS updates 2024-11-20 15:13:53 +00:00
JakobDev 45fa9e5ae9 fix: Allow Organisations to remove the Email Address (#5517)
It is possible to set a Email for a Organization. This Email is optional and only used to be displayed on the profile page. However, once you set an EMail, you can no longer remove it. This PR fixes that.

While working on the tests, I found out, that the API returns a 500 when trying to set an invalid EMail. I fixed that too. It returns a 422 now.

Fixes #4567

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/5517
Reviewed-by: Gusted <gusted@noreply.codeberg.org>
Reviewed-by: Otto <otto@codeberg.org>
Co-authored-by: JakobDev <jakobdev@gmx.de>
Co-committed-by: JakobDev <jakobdev@gmx.de>
2024-11-20 12:31:34 +00:00
12 changed files with 272 additions and 69 deletions

View file

@ -84,20 +84,3 @@ jobs:
ref_name: '${{ github.ref_name }}'
image: 'codeberg.org/forgejo-experimental/forgejo'
tag_suffix: '-rootless'
- name: set up go for the DNS update below
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
uses: https://code.forgejo.org/actions/setup-go@v5
with:
go-version-file: "go.mod"
- name: update the _release.experimental DNS record
if: vars.ROLE == 'forgejo-experimental' && secrets.OVH_APP_KEY != ''
uses: https://code.forgejo.org/actions/ovh-dns-update@v1
with:
subdomain: _release.experimental
domain: forgejo.com # there is a CNAME from .org to .com (for security reasons)
record-id: 5283602601
value: v=${{ github.ref_name }}
ovh-app-key: ${{ secrets.OVH_APP_KEY }}
ovh-app-secret: ${{ secrets.OVH_APP_SECRET }}
ovh-consumer-key: ${{ secrets.OVH_CON_KEY }}

View file

@ -139,6 +139,38 @@ func GetPrimaryEmailAddressOfUser(ctx context.Context, uid int64) (*EmailAddress
return ea, nil
}
// Deletes the primary email address of the user
// This is only allowed if the user is a organization
func DeletePrimaryEmailAddressOfUser(ctx context.Context, uid int64) error {
user, err := GetUserByID(ctx, uid)
if err != nil {
return err
}
if user.Type != UserTypeOrganization {
return fmt.Errorf("%s is not a organization", user.Name)
}
ctx, committer, err := db.TxContext(ctx)
if err != nil {
return err
}
defer committer.Close()
_, err = db.GetEngine(ctx).Exec("DELETE FROM email_address WHERE uid = ? AND is_primary = true", uid)
if err != nil {
return err
}
user.Email = ""
err = UpdateUserCols(ctx, user, "email")
if err != nil {
return err
}
return committer.Commit()
}
// GetEmailAddresses returns all email addresses belongs to given user.
func GetEmailAddresses(ctx context.Context, uid int64) ([]*EmailAddress, error) {
emails := make([]*EmailAddress, 0, 5)

View file

@ -163,3 +163,21 @@ func TestGetActivatedEmailAddresses(t *testing.T) {
})
}
}
func TestDeletePrimaryEmailAddressOfUser(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
user, err := user_model.GetUserByName(db.DefaultContext, "org3")
require.NoError(t, err)
assert.Equal(t, "org3@example.com", user.Email)
require.NoError(t, user_model.DeletePrimaryEmailAddressOfUser(db.DefaultContext, user.ID))
user, err = user_model.GetUserByName(db.DefaultContext, "org3")
require.NoError(t, err)
assert.Empty(t, user.Email)
email, err := user_model.GetPrimaryEmailAddressOfUser(db.DefaultContext, user.ID)
assert.True(t, user_model.IsErrEmailAddressNotExist(err))
assert.Nil(t, email)
}

View file

@ -47,11 +47,11 @@ type CreateOrgOption struct {
// EditOrgOption options for editing an organization
type EditOrgOption struct {
FullName string `json:"full_name" binding:"MaxSize(100)"`
Email string `json:"email" binding:"MaxSize(255)"`
Description string `json:"description" binding:"MaxSize(255)"`
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
Location string `json:"location" binding:"MaxSize(50)"`
FullName string `json:"full_name" binding:"MaxSize(100)"`
Email *string `json:"email" binding:"MaxSize(255)"`
Description string `json:"description" binding:"MaxSize(255)"`
Website string `json:"website" binding:"ValidUrl;MaxSize(255)"`
Location string `json:"location" binding:"MaxSize(50)"`
// possible values are `public`, `limited` or `private`
// enum: ["public", "limited", "private"]
Visibility string `json:"visibility" binding:"In(,public,limited,private)"`

View file

@ -2126,7 +2126,7 @@ settings.collaboration.undefined=Neurčeno
settings.hooks=Webhooky
settings.githooks=Git hooky
settings.basic_settings=Základní nastavení
settings.mirror_settings=Nastavení zrcadla
settings.mirror_settings=Nastavení zrcadel
settings.mirror_settings.docs=Nastavte repozitář pro automatickou synchronizaci commitů, značek a větví s jiným repozitářem.
settings.mirror_settings.docs.disabled_pull_mirror.instructions=Nastavte váš projekt pro automatické nahrávání commitů, značek a větví do jiného repozitáře. Správce webu zakázal zrcadla pro natažení.
settings.mirror_settings.docs.disabled_push_mirror.instructions=Nastavte svůj projekt pro automatické natažení commitů, značek a větví z jiného repozitáře.

View file

@ -2791,6 +2791,8 @@ settings.transfer.button = Transferir la propiedad
settings.transfer.modal.title = Transferir la propiedad
settings.enter_repo_name = Introduce el nombre del propietario y del repositorio exactamente como se muestra:
settings.confirmation_string = Cadena de confirmación
issues.filter_sort.relevance = Relevancia
settings.transfer_quota_exceeded = El nuevo propietario (%s) ha sobrepasado la cuota. El repositorio no ha sido transferido.
[graphs]

View file

@ -1168,10 +1168,10 @@ file_view_rendered=Skatīt rezultātu
file_view_raw=Rādīt neapstrādātu
file_permalink=Patstāvīgā saite
file_too_large=Šis fails ir par lielu, lai to parādītu.
invisible_runes_header=`Šīs fails satur neredzamus unikoda simbolus`
invisible_runes_description=is fails satur neredzamus unikoda simbolus, kas ir neatšķirami cilvēkiem, bet dators tās var atstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
ambiguous_runes_header=is fails satur neviennozīmīgus unikoda simbolus`
ambiguous_runes_description=is fails satur unikoda simbolus, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
invisible_runes_header=Šī datne satur neredzamas unikoda rakstzīmes
invisible_runes_description=ī datne satur neredzamas unikoda rakstzīmes, kas ir neatšķiramas cilvēkiem, bet dators tās var apstrādāt atšķirīgi. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai atklātu tās.`
ambiguous_runes_header=ī datne satur neviennozīmīgas unikoda rakstzīmes`
ambiguous_runes_description=ī datne satur unikoda rakstzīmes, kas var tikt sajauktas ar citām rakstzīmēm. Ja šķiet, ka tas ir ar nolūku, šo brīdinājumu var droši neņemt vērā. Jāizmanto atsoļa taustiņš (Esc), lai tās atklātu.`
invisible_runes_line=`Šajā rindā ir neredzamas unikoda rakstzīmes`
ambiguous_runes_line=`Šajā rindā ir neviennozīmīgas unikoda rakstzīmes`
ambiguous_character=`%[1]c [U+%04[1]X] var tikt sajaukts ar %[2]c [U+%04[2]X]`
@ -1194,7 +1194,7 @@ commit.contained_in=Šī revīzija ir iekļauta:
commit.contained_in_default_branch=Šī revīzija ir daļa no noklusētā atzara
commit.load_referencing_branches_and_tags=Ielādēt atzarus un tagus, kas atsaucas uz šo revīziju
blame=Vainot
download_file=Lejupielādēt failu
download_file=Lejupielādēt datni
normal_view=Parastais skats
line=rinda
lines=rindas
@ -1205,16 +1205,16 @@ editor.new_file=Jauna datne
editor.upload_file=Augšupielādēt datni
editor.edit_file=Labot datni
editor.preview_changes=Priekšskatīt izmaiņas
editor.cannot_edit_lfs_files=LFS failus nevar labot no tīmekļa saskarnes.
editor.cannot_edit_non_text_files=Nav iespējams labot bināros failus no pārlūka saskarnes.
editor.cannot_edit_lfs_files=LFS datnes tīmekļa saskarnē nevar labot.
editor.cannot_edit_non_text_files=Binārās datnes tīmekļa saskarnē nevar labot.
editor.edit_this_file=Labot datni
editor.this_file_locked=Fails ir bloķēts
editor.must_be_on_a_branch=Ir jābūt izvēlētam atzaram, lai varētu veikt vai piedāvāt izmaiņas šim failam.
editor.fork_before_edit=Lai varētu labot failu, ir nepieciešams atdalīt repozitoriju.
editor.this_file_locked=Datne ir slēgta
editor.must_be_on_a_branch=Ir jābūt zarā, lai šajā datnē veiktu vai ierosinātu izmaiņas.
editor.fork_before_edit=Jāizveido šīs glabātavas atzarojums, lai šajā datnē veiktu vai ierosinātu izmaiņas.
editor.delete_this_file=Izdzēst datni
editor.must_have_write_access=Jums ir jābūt rakstīšanas tiesībām, lai varētu veikt vai piedāvāt izmaiņas šim failam.
editor.file_delete_success=Fails "%s" tika izdzēsts.
editor.name_your_file=Ievadiet faila nosaukumu
editor.must_have_write_access=Ir jābūt rakstīšanas piekļuvei, lai šajā datnē veiktu vai ierosinātu izmaiņas.
editor.file_delete_success=Datne "%s" tika izdzēsta.
editor.name_your_file=Jāpiešķir datnei nosaukums
editor.filename_help=Mapi var pievienot, ja ieraksta tās nosaukumu, aiz kura ir slīpsvītra ("/"). Mapi var noņemt ar atpakaļatkāpes taustiņa nospiešanu ievades lauka sākumā.
editor.or=vai
editor.cancel_lower=Atcelt
@ -1233,33 +1233,33 @@ editor.signoff_desc=Pievienot revīzijas žurnāla ziņojuma beigās Signed-off-
editor.commit_directly_to_this_branch=Apstiprināt revīzijas izmaiņas atzarā <strong class="%[2]s">%[1]s</strong>.
editor.create_new_branch=Izveidot <strong>jaunu atzaru</strong> un izmaiņu pieprasījumu šai revīzijai.
editor.create_new_branch_np=Izveidot <strong>jaunu atzaru</strong> šai revīzijai.
editor.propose_file_change=Ieteikt faila izmaiņas
editor.propose_file_change=Ierosināt datnes izmaiņas
editor.new_branch_name=Jaunā atzara nosaukums šai revīzijai
editor.new_branch_name_desc=Jaunā atzara nosaukums…
editor.cancel=Atcelt
editor.filename_cannot_be_empty=Faila nosaukums nevar būt tukšs.
editor.filename_is_invalid=Faila nosaukums "%s" nav korekts.
editor.filename_cannot_be_empty=Datnes nosaukums nevar būt tukšs.
editor.filename_is_invalid=Datnes nosaukums "%s" nav derīgs.
editor.branch_does_not_exist=Šajā repozitorijā neeksistē atzars "%s".
editor.branch_already_exists=Atzars "%s" šajā repozitorijā jau eksistē.
editor.directory_is_a_file=Direktorijas nosaukums "%s" vecāka ceļā ir fails nevis direktorija šajā repozitorijā.
editor.file_is_a_symlink=Fails "%s" ir norāde, kuru nav iespējams labot no tīmekļa redaktora
editor.filename_is_a_directory=Faila nosaukums "%s" sakrīt ar direktorijas nosaukumu šajā repozitorijā.
editor.file_editing_no_longer_exists=Fails "%s", ko labojat, vairs neeksistē šajā repozitorijā.
editor.file_deleting_no_longer_exists=Fails "%s", ko dzēšat, vairs neeksistē šajā repozitorijā.
editor.directory_is_a_file=Mapes nosaukums "%s" šajā glabātavā jau tiek izmantots kā datnes nosaukums.
editor.file_is_a_symlink=`"%s" ir simboliska saite. Simboliskās saites tīmekļa redaktorā nevar labot`
editor.filename_is_a_directory=Datnes nosaukums "%s" šajā glabātavā jau tiek izmantos kā mapes nosaukums.
editor.file_editing_no_longer_exists=Datne, kas tiek labota ("%s"), šajā glabātavā vairs nepastāv.
editor.file_deleting_no_longer_exists=Datne, kas tiek izdzēsta ("%s"), šajā glabātavā vairs nepastāv.
editor.file_changed_while_editing=Datnes saturs ir mainījies kopš labošanas uzsākšanas. <a target="_blank" rel="noopener noreferrer" href="%s">Klikšķināt šeit</a>, lai apskatītu vai <strong>atkārtoti iesūtītu izmaiņas</strong>, lai tās pārrakstītu.
editor.file_already_exists=Fails ar nosaukumu "%s" šajā repozitorijā jau eksistē.
editor.commit_empty_file_header=Iesūtīt tukšu failu
editor.commit_empty_file_text=Fails, ko vēlaties iesūtīt, ir tukšs. Vai turpināt?
editor.file_already_exists=Datne ar nosaukumu "%s" jau pastāv šajā repozitorijā.
editor.commit_empty_file_header=Iesūtīt tukšu datni
editor.commit_empty_file_text=Iesūtāmā datne ir tukša. Turpināt?
editor.no_changes_to_show=Nav izmaiņu, ko rādīt.
editor.fail_to_update_file=Neizdevās atjaunot/izveidot failu "%s".
editor.fail_to_update_file=Neizdevās atjaunināt/izveidot datni "%s".
editor.fail_to_update_file_summary=Kļūdas ziņojums:
editor.push_rejected_no_message=Serveris noraidīja izmaiņas bez paziņojuma. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected=Serveris noraidīja izmaiņas. Lūgums pārbaudīt Git aizķeres.
editor.push_rejected_summary=Pilns noraidīšanas ziņojums:
editor.add_subdir=Pievienot direktoriju…
editor.unable_to_upload_files=Neizdevās augšupielādēt failus uz direktoriju "%s", kļūda: %v
editor.upload_file_is_locked=Failu "%s" ir nobloķējis %s.
editor.upload_files_to_dir=`Augšupielādēt failus uz direktoriju "%s"`
editor.unable_to_upload_files=Neizdevās augšupielādēt datnes "%s" šīs kļūdas dēļ: %v
editor.upload_file_is_locked=Datni "%s" ir aizslēdza %s.
editor.upload_files_to_dir=Augšupielādēt datnes "%s"
editor.cannot_commit_to_protected_branch=Nav atļauts veikt izmaiņas aizsargātam atzaram "%s".
editor.no_commit_to_branch=Nevar apstiprināt revīzijas atzarā:
editor.user_no_push_to_branch=Lietotājs nevar iesūtīt izmaiņas šajā atzarā
@ -1387,7 +1387,7 @@ issues.label_templates.title=Ielādēt iepriekš noteiktu iezīmju kopu
issues.label_templates.info=Nav izveidota neviena etiķete. Jūs varat noklikšķināt uz "Jauna etiķete" augstāk, lai to izveidotu vai izmantot zemāk piedāvātās etiķetes:
issues.label_templates.helper=Izvēlieties etiķešu kopu
issues.label_templates.use=Izmantot etiķešu kopu
issues.label_templates.fail_to_load_file=Neizdevās ielādēt etiķetes sagataves failu "%s": %v
issues.label_templates.fail_to_load_file=Neizdevās ielādēt iezīmju sagataves datni "%s": %v
issues.add_label=pievienoja %s etiķeti %s
issues.add_labels=pievienoja %s etiķetes %s
issues.remove_label=noņēma %s etiķeti %s
@ -1691,9 +1691,9 @@ pulls.allow_edits_from_maintainers_err=Atjaunošana neizdevās
pulls.compare_changes_desc=Izvēlieties atzaru, kurā sapludināt izmaiņas un atzaru, no kura tās saņemt.
pulls.has_viewed_file=Skatīts
pulls.has_changed_since_last_review=Mainīts kopš pēdējās recenzijas
pulls.viewed_files_label=%[1]d no %[2]d failiem apskatīts
pulls.expand_files=Izvērst visus failus
pulls.collapse_files=Savērst visus failus
pulls.viewed_files_label=apskatītas %[1]d no %[2]d datnēm
pulls.expand_files=Izvērst visas datnes
pulls.collapse_files=Savērst visas datnes
pulls.compare_base=pamata
pulls.compare_compare=salīdzināmais
pulls.switch_comparison_type=Mainīt salīdzināšanas tipu
@ -1716,7 +1716,7 @@ pulls.merged_title_desc_few=sapludināja %[1]d revīzijas no <code>%[2]s</code>
pulls.change_target_branch_at=`nomainīja mērķa atzaru no <b>%s</b> uz <b>%s</b> %s`
pulls.tab_conversation=Saruna
pulls.tab_commits=Revīzijas
pulls.tab_files=Izmainītie faili
pulls.tab_files=Izmainītās datnes
pulls.reopen_to_merge=Atkārtoti atveriet izmaiņu pieprasījumu, lai veiktu sapludināšanu.
pulls.cant_reopen_deleted_branch=Šo izmaiņu pieprasīju nevar atkāroti atvērt, jo atzars ir izdzēsts.
pulls.merged=Sapludināts
@ -1742,13 +1742,13 @@ pulls.blocked_by_approvals=Šim izmaiņu pieprasījumam vēl nav pietiekami daud
pulls.blocked_by_rejection=Šim izmaiņu pieprasījumam oficiālais recenzents ir pieprasījis labojumus.
pulls.blocked_by_official_review_requests=Šim izmaiņu pieprasījumam ir oficiāli recenzijas pieprasījumi.
pulls.blocked_by_outdated_branch=Šis izmaiņu pieprasījums ir bloķēts, jo tas ir novecojis.
pulls.blocked_by_changed_protected_files_1=Šis izmaiņu pieprasījums ir bloķēts, jo tas izmaina aizsargāto failu:
pulls.blocked_by_changed_protected_files_n=Šis izmaiņu pieprasījums ir bloķēts, jo tas izmaina aizsargātos failus:
pulls.blocked_by_changed_protected_files_1=Šis izmaiņu pieprasījums ir aizturēts, jo tas izmaina aizsargātu datni:
pulls.blocked_by_changed_protected_files_n=Šis izmaiņu pieprasījums ir aizturēts, jo tas izmaina aizsargātas datnes:
pulls.can_auto_merge_desc=Šo izmaiņu pieprasījumu var automātiski sapludināt.
pulls.cannot_auto_merge_desc=Šis izmaiņu pieprasījums nevar tikt automātiski sapludināts konfliktu dēļ.
pulls.cannot_auto_merge_helper=Sapludiniet manuāli, lai atrisinātu konfliktus.
pulls.num_conflicting_files_1=%d fails ar konfliktiem
pulls.num_conflicting_files_n=%d faili ar konfliktiem
pulls.num_conflicting_files_1=%d nesaderīga datne
pulls.num_conflicting_files_n=%d nesaderīgas datnes
pulls.approve_count_1=%d apstiprinājums
pulls.approve_count_n=%d apstiprinājumi
pulls.reject_count_1=%d izmaiņu pieprasījums
@ -1899,7 +1899,7 @@ wiki.reserved_page=Vikivietnes lapas nosaukums "%s" ir rezervēts.
wiki.pages=Lapas
wiki.last_updated=Pēdējo reizi labota %s
wiki.page_name_desc=Ievadiet vikivietnes lapas nosaukumu. Speciālie nosaukumi ir: 'Home', '_Sidebar' un '_Footer'.
wiki.original_git_entry_tooltip=Attēlot oriģinālo Git faila nosaukumu.
wiki.original_git_entry_tooltip=Rādīt sākotnējo Git datni, nevis izmantot draudzīgo saiti.
activity=Aktivitāte
activity.period.filter_label=Laika periods:
@ -1956,8 +1956,8 @@ activity.git_stats_commit_n=%d revīzijas
activity.git_stats_push_to_branch=atzarā %s un
activity.git_stats_push_to_all_branches=visos atzaros.
activity.git_stats_on_default_branch=Atzarā %s,
activity.git_stats_file_1=%d fails
activity.git_stats_file_n=%d faili
activity.git_stats_file_1=%d datne
activity.git_stats_file_n=%d datnes
activity.git_stats_files_changed_1=tika izmainīts
activity.git_stats_files_changed_n=tika izmainīti
activity.git_stats_additions=un tika veiktas
@ -2321,7 +2321,7 @@ settings.require_signed_commits_desc=Noraidīt iesūtītās izmaiņas šim atzar
settings.protect_branch_name_pattern=Aizsargātā zara šablons
settings.protect_branch_name_pattern_desc=Aizsargāto atzaru nosaukumu šabloni. Šablonu pierakstu skatīt <a href="%s">dokumentācijā</a>. Piemēri: main, release/**
settings.protect_patterns=Šabloni
settings.protect_protected_file_patterns=Aizsargāto failu šablons (vairākus var norādīt atdalot ar semikolu ';'):
settings.protect_protected_file_patterns=Aizsargāto datņu paraugs (vairākus atdala ar semikolu ";")
settings.protect_protected_file_patterns_desc=Aizsargātie faili, ko nevar mainīt, pat ja lietotājam ir tiesības veidot jaunus, labot vai dzēst failus šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama <a href='%s'>%s</a> dokumentācijā. Piemēram, <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.protect_unprotected_file_patterns=Neaizsargāto failu šablons (vairākus var norādīt atdalot ar semikolu ';'):
settings.protect_unprotected_file_patterns_desc=Neaizsargātie faili, ko iespējams mainīt apejot iesūtīšanas ierobežojumus, ja lietotājam ir tiesības iesūtīt izmaiņas šajā atzarā. Vairākus šablons ir iespējams norādīt atdalot tos ar semikolu (';'). Sīkāka informācija par šabloniem pieejama <a href='%[1]s'>%[2]s</a> dokumentācijā. Piemēram, <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.

View file

@ -15,6 +15,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/optional"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/validation"
"code.gitea.io/gitea/modules/web"
"code.gitea.io/gitea/routers/api/v1/user"
"code.gitea.io/gitea/routers/api/v1/utils"
@ -340,13 +341,28 @@ func Edit(ctx *context.APIContext) {
// "$ref": "#/responses/Organization"
// "404":
// "$ref": "#/responses/notFound"
// "422":
// "$ref": "#/responses/error"
form := web.GetForm(ctx).(*api.EditOrgOption)
if form.Email != "" {
if err := user_service.ReplacePrimaryEmailAddress(ctx, ctx.Org.Organization.AsUser(), form.Email); err != nil {
ctx.Error(http.StatusInternalServerError, "ReplacePrimaryEmailAddress", err)
return
if form.Email != nil {
if *form.Email == "" {
err := user_model.DeletePrimaryEmailAddressOfUser(ctx, ctx.Org.Organization.ID)
if err != nil {
ctx.Error(http.StatusInternalServerError, "DeletePrimaryEmailAddressOfUser", err)
return
}
ctx.Org.Organization.Email = ""
} else {
if err := user_service.ReplacePrimaryEmailAddress(ctx, ctx.Org.Organization.AsUser(), *form.Email); err != nil {
if validation.IsErrEmailInvalid(err) || validation.IsErrEmailCharIsNotSupported(err) {
ctx.Error(http.StatusUnprocessableEntity, "ReplacePrimaryEmailAddress", err)
} else {
ctx.Error(http.StatusInternalServerError, "ReplacePrimaryEmailAddress", err)
}
return
}
}
}

View file

@ -93,7 +93,13 @@ func SettingsPost(ctx *context.Context) {
ctx.Org.OrgLink = setting.AppSubURL + "/org/" + url.PathEscape(org.Name)
}
if form.Email != "" {
if form.Email == "" {
err := user_model.DeletePrimaryEmailAddressOfUser(ctx, org.ID)
if err != nil {
ctx.ServerError("DeletePrimaryEmailAddressOfUser", err)
return
}
} else {
if err := user_service.ReplacePrimaryEmailAddress(ctx, org.AsUser(), form.Email); err != nil {
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_invalid"), tplSettingsOptions, &form)

View file

@ -2263,6 +2263,9 @@
},
"404": {
"$ref": "#/responses/notFound"
},
"422": {
"$ref": "#/responses/error"
}
}
}

View file

@ -218,3 +218,57 @@ func TestAPIOrgSearchEmptyTeam(t *testing.T) {
assert.EqualValues(t, "Empty", data.Data[0].Name)
}
}
func TestAPIOrgChangeEmail(t *testing.T) {
defer tests.PrepareTestEnv(t)()
session := loginUser(t, "user1")
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteOrganization)
t.Run("Invalid", func(t *testing.T) {
newMail := "invalid"
settings := api.EditOrgOption{Email: &newMail}
resp := MakeRequest(t, NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &settings).AddTokenAuth(token), http.StatusUnprocessableEntity)
var org *api.Organization
DecodeJSON(t, resp, &org)
assert.Empty(t, org.Email)
})
t.Run("Valid", func(t *testing.T) {
newMail := "example@example.com"
settings := api.EditOrgOption{Email: &newMail}
resp := MakeRequest(t, NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &settings).AddTokenAuth(token), http.StatusOK)
var org *api.Organization
DecodeJSON(t, resp, &org)
assert.Equal(t, "example@example.com", org.Email)
})
t.Run("NoChange", func(t *testing.T) {
settings := api.EditOrgOption{}
resp := MakeRequest(t, NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &settings).AddTokenAuth(token), http.StatusOK)
var org *api.Organization
DecodeJSON(t, resp, &org)
assert.Equal(t, "example@example.com", org.Email)
})
t.Run("Empty", func(t *testing.T) {
newMail := ""
settings := api.EditOrgOption{Email: &newMail}
resp := MakeRequest(t, NewRequestWithJSON(t, "PATCH", "/api/v1/orgs/org3", &settings).AddTokenAuth(token), http.StatusOK)
var org *api.Organization
DecodeJSON(t, resp, &org)
assert.Empty(t, org.Email)
})
}

View file

@ -0,0 +1,89 @@
// Copyright 2024 The Forgejo Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"fmt"
"net/http"
"testing"
auth_model "code.gitea.io/gitea/models/auth"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
)
func getOrgSettingsFormData(t *testing.T, session *TestSession, orgName string) map[string]string {
return map[string]string{
"_csrf": GetCSRF(t, session, fmt.Sprintf("/org/%s/settings", orgName)),
"name": orgName,
"full_name": "",
"email": "",
"description": "",
"website": "",
"location": "",
"visibility": "0",
"repo_admin_change_team_access": "on",
"max_repo_creation": "-1",
}
}
func getOrgSettings(t *testing.T, token, orgName string) *api.Organization {
t.Helper()
req := NewRequestf(t, "GET", "/api/v1/orgs/%s", orgName).AddTokenAuth(token)
resp := MakeRequest(t, req, http.StatusOK)
var org *api.Organization
DecodeJSON(t, resp, &org)
return org
}
func TestOrgSettingsChangeEmail(t *testing.T) {
defer tests.PrepareTestEnv(t)()
const orgName = "org3"
settingsURL := fmt.Sprintf("/org/%s/settings", orgName)
session := loginUser(t, "user1")
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadOrganization)
t.Run("Invalid", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
settings := getOrgSettingsFormData(t, session, orgName)
settings["email"] = "invalid"
session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusOK)
org := getOrgSettings(t, token, orgName)
assert.Equal(t, "org3@example.com", org.Email)
})
t.Run("Valid", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
settings := getOrgSettingsFormData(t, session, orgName)
settings["email"] = "example@example.com"
session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther)
org := getOrgSettings(t, token, orgName)
assert.Equal(t, "example@example.com", org.Email)
})
t.Run("Empty", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
settings := getOrgSettingsFormData(t, session, orgName)
settings["email"] = ""
session.MakeRequest(t, NewRequestWithValues(t, "POST", settingsURL, settings), http.StatusSeeOther)
org := getOrgSettings(t, token, orgName)
assert.Empty(t, org.Email)
})
}