mirror of
https://codeberg.org/forgejo/forgejo
synced 2024-11-21 17:34:24 +01:00
Compare commits
30 commits
a290f0b6d9
...
0094528a78
Author | SHA1 | Date | |
---|---|---|---|
0094528a78 | |||
2c5d3f3c29 | |||
cd1ddd31cf | |||
1536d47990 | |||
ab1bbb8bff | |||
ef497352f7 | |||
eda9298adf | |||
3b7a56fce5 | |||
d9a9c2db66 | |||
6de1ce7d9c | |||
e4d2614824 | |||
b352954b7a | |||
5cd42dffdb | |||
e0de2974a0 | |||
34a760b04f | |||
aa9ed29fbe | |||
c99833bfd8 | |||
07f341c2b5 | |||
2e5fbb9c9f | |||
4ed2844fde | |||
19560047aa | |||
f1ac1e50a5 | |||
ef61385da2 | |||
2a5fad676d | |||
05be8ddfa5 | |||
15b49be879 | |||
46a7459e6e | |||
7015bdfa48 | |||
a69943085a | |||
45fa9e5ae9 |
|
@ -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 }}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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)"`
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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>.
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
3
templates/swagger/v1_json.tmpl
generated
3
templates/swagger/v1_json.tmpl
generated
|
@ -2263,6 +2263,9 @@
|
|||
},
|
||||
"404": {
|
||||
"$ref": "#/responses/notFound"
|
||||
},
|
||||
"422": {
|
||||
"$ref": "#/responses/error"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
89
tests/integration/org_settings_test.go
Normal file
89
tests/integration/org_settings_test.go
Normal 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)
|
||||
})
|
||||
}
|
Loading…
Reference in a new issue