Compare commits

..

1 Commits

Author SHA1 Message Date
Jacques ROUSSEL fd3dfe746d 🐛(ci) use github action for argocd webhook notification
In order to refactor this notification between alls projetcs, we
chooseto use a custom github action
2025-03-28 14:13:12 +01:00
22 changed files with 58 additions and 256 deletions
+6 -9
View File
@@ -119,12 +119,9 @@ jobs:
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
steps:
-
name: Checkout repository
uses: actions/checkout@v4
-
name: Call argocd github webhook
run: |
data='{"ref": "'$GITHUB_REF'","repository": {"html_url":"'$GITHUB_SERVER_URL'/numerique-gouv/lasuite-deploiement"}}'
sig=$(echo -n ${data} | openssl dgst -sha1 -hmac "${{ secrets.ARGOCD_PREPROD_WEBHOOK_SECRET }}" | awk '{print "X-Hub-Signature: sha1="$2}')
curl -X POST -H 'X-GitHub-Event:push' -H "Content-Type: application/json" -H "${sig}" --data "${data}" ${{ vars.ARGOCD_PREPROD_WEBHOOK_URL }}
- uses: numerique-gouv/action-argocd-webhook-notification@main
id: notify
with:
deployment_repo_path: "${{ secrets.DEPLOYMENT_REPO_URL }}"
argocd_webhook_secret: "${{ secrets.ARGOCD_PREPROD_WEBHOOK_SECRET }}"
argocd_url: "${{ vars.ARGOCD_PREPROD_WEBHOOK_URL }}"
+3
View File
@@ -0,0 +1,3 @@
[submodule "secrets"]
path = secrets
url = ../secrets
+1 -1
View File
@@ -212,7 +212,7 @@ POSTGRES_PASSWORD: pass
Now you are ready to deploy Visio without AI. AI required more dependencies (Openai-compliant API, LiveKit Egress, Cold storage and a docs deployment to push resumes). To deploy meet you need to provide all previous information to the helm chart.
```
$ helm repo add meet https://suitenumerique.github.io/meet/
$ helm repo add meet https://numerique-gouv.github.io/meet/
$ helm repo update
$ helm install meet meet/meet -f examples/meet.values.yaml
```
Submodule
+1
Submodule secrets added at 2ba12db71d
@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Generate Document</title>
</head>
<body>
<h2>Generate Document</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Generate PDF</button>
</form>
</body>
</html>
+1
View File
@@ -314,6 +314,7 @@ class Base(Configuration):
EMAIL_FROM = values.Value("from@example.com")
AUTH_USER_MODEL = "core.User"
INVITATION_VALIDITY_DURATION = 604800 # 7 days, in seconds
# CORS
CORS_ALLOW_CREDENTIALS = True
+1
View File
@@ -54,6 +54,7 @@ dependencies = [
"requests==2.32.3",
"sentry-sdk==2.22.0",
"url-normalize==1.4.3",
"WeasyPrint>=60.2",
"whitenoise==6.9.0",
"mozilla-django-oidc==4.0.1",
"livekit-api==0.8.2",
-1
View File
@@ -223,7 +223,6 @@ const config: Config = {
fonts: {
sans: {
value: [
'Marianne',
'Source Sans',
'Source Sans fallback',
'ui-sans-serif',
+3 -10
View File
@@ -1,4 +1,4 @@
import { css, cva, RecipeVariantProps } from '@/styled-system/css'
import { cva, RecipeVariantProps } from '@/styled-system/css'
import React from 'react'
const avatar = cva({
@@ -19,8 +19,7 @@ const avatar = cva({
list: {
width: '32px',
height: '32px',
fontSize: '1.3rem',
lineHeight: '1rem',
fontSize: '1.25rem',
},
placeholder: {
width: '100%',
@@ -61,13 +60,7 @@ export const Avatar = ({
className={avatar({ context, notification })}
{...props}
>
<span
className={css({
marginTop: '-0.3rem',
})}
>
{initial}
</span>
{initial}
</div>
)
}
@@ -25,9 +25,7 @@ export const FeedbackBanner = () => {
})}
>
<RiErrorWarningLine size={20} aria-hidden="true" />
<Text as="p" variant="sm">
{t('feedback.context')}
</Text>
<Text as="p">{t('feedback.context')}</Text>
<div
className={css({
display: 'flex',
@@ -35,7 +33,7 @@ export const FeedbackBanner = () => {
gap: 0.25,
})}
>
<A href={GRIST_FORM} target="_blank" size="sm">
<A href={GRIST_FORM} target="_blank">
{t('feedback.cta')}
</A>
<RiExternalLinkLine size={16} aria-hidden="true" />
@@ -17,13 +17,12 @@ const Heading = styled('h2', {
base: {
width: 'fit-content',
marginBottom: 0,
fontSize: '1.3rem',
fontWeight: '600',
fontSize: '1.5rem',
marginTop: '0.75rem',
lineHeight: '2rem',
maxWidth: '23rem',
textAlign: 'center',
textWrap: 'balance',
textWrap: 'pretty',
},
})
@@ -32,7 +31,7 @@ const Body = styled('p', {
maxWidth: '23rem',
textAlign: 'center',
textWrap: 'pretty',
lineHeight: '1.4rem',
lineHeight: '1.2rem',
fontSize: '1rem',
},
})
@@ -103,7 +102,7 @@ const Slide = styled('div', {
alignItems: 'center',
gap: '0.5rem',
justifyContent: 'start',
minHeight: { base: 'none', xsm: '580px' },
minHeight: { base: 'none', xsm: '550px' },
minWidth: { base: 'none', xsm: '200px' },
width: { base: '100%', xsm: '22.625rem' },
},
@@ -72,8 +72,8 @@ const LeftColumn = ({ children }: { children?: ReactNode }) => {
textAlign: 'left',
alignItems: 'flex-start',
flexShrink: '1',
flexBasis: '40rem',
maxWidth: '40rem',
flexBasis: '36rem',
maxWidth: '36rem',
padding: '1em 3em',
},
})}
@@ -120,13 +120,14 @@ const Separator = styled('div', {
const Heading = styled('h1', {
base: {
fontWeight: '600',
fontWeight: '500',
fontStyle: 'normal',
fontStretch: 'normal',
fontOpticalSizing: 'auto',
paddingBottom: '1.2rem',
marginBottom: 0,
paddingBottom: '0.75rem',
fontSize: '2.3rem',
lineHeight: '2.6rem',
lineHeight: '2.5rem',
letterSpacing: '0',
xsm: {
fontSize: '3rem',
@@ -138,9 +139,9 @@ const Heading = styled('h1', {
const IntroText = styled('div', {
base: {
marginBottom: '3rem',
fontSize: '1.2rem',
lineHeight: '1.5rem',
textWrap: 'balance',
fontSize: '1.5rem',
lineHeight: '1.8rem',
textWrap: 'pretty',
maxWidth: '32rem',
},
})
@@ -37,14 +37,7 @@ export const Admin = () => {
flexDirection="column"
alignItems="start"
>
<Text
variant="note"
wrap="pretty"
className={css({
textStyle: 'sm',
})}
margin={'md'}
>
<Text variant="note" wrap="pretty" margin="md">
{t('description')}
</Text>
<RACSeparator
@@ -75,8 +68,8 @@ export const Admin = () => {
</Text>
<Field
type="radioGroup"
label={t('access.type')}
aria-label={t('access.type')}
label="Type d'accès à la réunion"
aria-label="Type d'accès à la réunion"
labelProps={{
className: css({
fontSize: '1rem',
@@ -1,66 +0,0 @@
import { A, Button, Dialog, P } from '@/primitives'
import { useTranslation } from 'react-i18next'
import { css } from '@/styled-system/css'
// todo - refactor it into a generic system
export const ScreenShareErrorModal = ({
isOpen,
onClose,
}: {
isOpen: boolean
onClose: () => void
}) => {
const { t } = useTranslation('rooms', { keyPrefix: 'error.screenShare' })
const isMac = navigator.userAgent.toLowerCase().indexOf('mac') !== -1
return (
<Dialog
isOpen={isOpen}
role="alertdialog"
title={t('title')}
aria-label={t('ariaLabel')}
onClose={onClose}
>
{({ close }) => {
return (
<>
<P>
{t('message')}{' '}
{isMac && (
<>
{t('macInstructions')}{' '}
<A
href="x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"
color="primary"
aria-label={t('macSystemPreferences') + '-' + t('newTab')}
>
{t('macSystemPreferences')}
</A>
.{' '}
</>
)}
{t('helpLinkText')}{' '}
<A
href="https://lasuite.crisp.help/fr/article/visio-probleme-de-presentation-1xkf799/"
aria-label={t('helpLinkLabel') + '-' + t('newTab')}
target="_blank"
color="primary"
>
{t('helpLinkLabel')}
</A>
.
</P>
<Button
onPress={close}
size="sm"
variant="primary"
className={css({ marginLeft: 'auto', marginTop: '2rem' })}
>
{t('closeButton')}
</Button>
</>
)
}}
</Dialog>
)
}
@@ -13,7 +13,7 @@ import {
/**
* This is simply a wrapper around track-processor-js Processor
* in order to be compatible with a common interface BackgroundBlurProcessorInterface
* used across the project.
* used accross the project.
*/
export class BackgroundBlurTrackProcessorJsWrapper
implements BackgroundProcessorInterface
@@ -7,7 +7,7 @@ import {
} from '@livekit/components-core'
import { RoomEvent, Track } from 'livekit-client'
import * as React from 'react'
import { useState } from 'react'
import {
CarouselLayout,
ConnectionStateToast,
@@ -29,7 +29,6 @@ import { ParticipantTile } from '../components/ParticipantTile'
import { SidePanel } from '../components/SidePanel'
import { useSidePanel } from '../hooks/useSidePanel'
import { RecordingStateToast } from '../components/RecordingStateToast'
import { ScreenShareErrorModal } from '../components/ScreenShareErrorModal'
const LayoutWrapper = styled(
'div',
@@ -150,8 +149,6 @@ export function VideoConference({ ...props }: VideoConferenceProps) {
const { isSidePanelOpen } = useSidePanel()
const [isShareErrorVisible, setIsShareErrorVisible] = useState(false)
return (
<div
className="lk-video-conference"
@@ -165,10 +162,6 @@ export function VideoConference({ ...props }: VideoConferenceProps) {
value={layoutContext}
// onPinChange={handleFocusStateChange}
>
<ScreenShareErrorModal
isOpen={isShareErrorVisible}
onClose={() => setIsShareErrorVisible(false)}
/>
<div
// todo - extract these magic values into constant
style={{
@@ -214,18 +207,7 @@ export function VideoConference({ ...props }: VideoConferenceProps) {
</LayoutWrapper>
<MainNotificationToast />
</div>
<ControlBar
onDeviceError={(e) => {
console.error(e)
if (
e.source == Track.Source.ScreenShare &&
e.error.toString() ==
'NotAllowedError: Permission denied by system'
) {
setIsShareErrorVisible(true)
}
}}
/>
<ControlBar />
<SidePanel />
</LayoutContextProvider>
)}
-12
View File
@@ -60,17 +60,6 @@
"createRoom": {
"heading": "",
"body": ""
},
"screenShare": {
"title": "",
"ariaLabel": "",
"message": "",
"macInstructions": "",
"macSystemPreferences": "",
"helpLinkText": "",
"helpLinkLabel": "",
"closeButton": "",
"newTab": ""
}
},
"controls": {
@@ -189,7 +178,6 @@
"access": {
"title": "",
"description": "",
"type": "",
"levels": {
"public": {
"label": "",
-12
View File
@@ -61,17 +61,6 @@
"createRoom": {
"heading": "Authentication Required",
"body": "This room has not been created yet. Please authenticate to create it or wait for an authenticated user to do so."
},
"screenShare": {
"title": "Unable to share your screen",
"ariaLabel": "Unable to share your screen",
"message": "Your browser may not be allowed to record the screen on your computer.",
"macInstructions": "Go to your",
"macSystemPreferences": "System Preferences",
"helpLinkText": "To learn more, see",
"helpLinkLabel": "Presentation issue",
"closeButton": "Dismiss",
"newTab": "New window"
}
},
"controls": {
@@ -188,7 +177,6 @@
"access": {
"title": "Room access",
"description": "These settings will also apply to future occurrences of this meeting.",
"type": "Meeting access types",
"levels": {
"public": {
"label": "Open",
+2 -14
View File
@@ -61,17 +61,6 @@
"createRoom": {
"heading": "Authentification requise",
"body": "Cette réunion n'a pas encore été créée. Veuillez vous authentifier pour la créer ou attendre qu'un utilisateur authentifié le fasse."
},
"screenShare": {
"title": "Impossible de partager votre écran",
"ariaLabel": "Impossible de partager votre écran",
"message": "Il se peut que votre navigateur ne soit pas autorisé à enregistrer l'écran sur votre ordinateur.",
"macInstructions": "Accèdez à vos",
"macSystemPreferences": "Préférences système",
"helpLinkText": "Pour en savoir plus, consulter",
"helpLinkLabel": "Problème de présentation",
"closeButton": "Ignorer",
"newTab": "Nouvelle fenêtre"
}
},
"controls": {
@@ -187,12 +176,11 @@
"description": "Ces paramètres organisateur vous permettent de garder le contrôle de votre réunion. Seuls les organisateurs peuvent accéder à ces commandes.",
"access": {
"title": "Accès à la réunion",
"description": "Ces paramètres s'appliqueront également aux futures occurrences de cette réunion.",
"type": "Type d'accès à la réunion",
"description": "Ces paramètres s'appliqueront également aux futures occurences de cette réunion.",
"levels": {
"public": {
"label": "Ouvrir",
"description": "Tout le monde peut rejoindre la réunion sans autorisation."
"description": "Persone n'a à demander pour rejoindre la réunion."
},
"trusted": {
"label": "Ouvrir aux personnes de confiance",
+4 -74
View File
@@ -34,19 +34,7 @@
"usernameEmpty": "Uw naam kan niet leeg zijn"
},
"cameraDisabled": "Camera is uitgeschakeld.",
"cameraStarting": "Camera wordt ingeschakeld.",
"waiting": {
"title": "Verzoek tot deelname...",
"body": "U kunt deelnemen aan dit gesprek wanneer iemand u toestemming geeft"
},
"denied": {
"title": "U kunt niet deelnemen aan dit gesprek",
"body": "Uw verzoek tot deelname is geweigerd."
},
"timeoutInvite": {
"title": "U kunt niet deelnemen aan dit gesprek",
"body": "Niemand heeft gereageerd op uw verzoek om deel te nemen aan het gesprek"
}
"cameraStarting": "Camera wordt ingeschakeld."
},
"leaveRoomPrompt": "Dat zal u de vergadering doen verlaten.",
"shareDialog": {
@@ -61,17 +49,6 @@
"createRoom": {
"heading": "Verificatie vereist",
"body": "Deze ruimte is nog niet gemaakt. Logt u alstublieft in om hem aan te maken, of wacht tot een ingelogde gebruiker dat doet."
},
"screenShare": {
"title": "Kan uw scherm niet delen",
"ariaLabel": "Kan uw scherm niet delen",
"message": "Het is mogelijk dat uw browser geen toestemming heeft om het scherm op uw computer op te nemen.",
"macInstructions": "Ga naar uw",
"macSystemPreferences": "Systeemvoorkeuren",
"helpLinkText": "Meer informatie, zie",
"helpLinkLabel": "Presentatieprobleem",
"closeButton": "Negeren",
"newTab": "Nieuw venster"
}
},
"controls": {
@@ -107,10 +84,6 @@
"open": "Verberg AI-assistent",
"closed": "Toon AI-assistant"
},
"admin": {
"open": "Verberg beheerder",
"closed": "Toon beheerder"
},
"support": "Ondersteuning",
"moreOptions": "Meer opties",
"reactions": {
@@ -156,15 +129,13 @@
"participants": "Deelnemers",
"effects": "Effecten",
"chat": "Berichten in de chat",
"transcript": "AI-assistent",
"admin": "Beheerdersbediening"
"transcript": "AI-assistent"
},
"content": {
"participants": "deelnemers",
"effects": "effecten",
"chat": "berichten",
"transcript": "AI-assistent",
"admin": "Beheerdersbediening"
"transcript": "AI-assistent"
},
"closeButton": "Verberg {{content}}"
},
@@ -183,28 +154,6 @@
"button": "Stop met opname"
}
},
"admin": {
"description": "Deze organisatorinstellingen geven u controle over uw vergadering. Alleen organisatoren hebben toegang tot deze bedieningselementen.",
"access": {
"title": "Toegang tot vergadering",
"description": "Deze instellingen zijn ook van toepassing op toekomstige sessies van deze vergadering.",
"type": "Vergaderings toegangstypen",
"levels": {
"public": {
"label": "Open",
"description": "Niemand hoeft toestemming te vragen om deel te nemen aan de vergadering."
},
"trusted": {
"label": "Open voor vertrouwde personen",
"description": "Geauthenticeerde personen hoeven geen toestemming te vragen om deel te nemen aan de vergadering."
},
"restricted": {
"label": "Beperkt",
"description": "Personen die niet zijn uitgenodigd voor de vergadering moeten vragen om deel te nemen."
}
}
}
},
"rating": {
"submit": "Indienen",
"question": "Wat vindt u van de kwaliteit van het gesprek?",
@@ -223,12 +172,6 @@
"heading": "Bedankt voor uw inzending",
"body": "Ons productteam neemt de tijd om uw feedback zorgvuldig te bekijken. We zullen zo snel mogelijk antwoorden."
},
"authenticationMessage": {
"heading": "Hoe kunnen we contact met u opnemen?",
"placeholder": "Uw e-mail",
"submit": "Verzenden",
"ignore": "Negeren"
},
"participants": {
"subheading": "In de ruimte",
"you": "U",
@@ -247,20 +190,7 @@
},
"raisedHands": "Opgestoken handen",
"lowerParticipantHand": "Laat {{name}}'s hand zakken",
"lowerParticipantsHand": "Laat alle handen zakken",
"waiting": {
"title": "Wachtkamer",
"accept": {
"button": "Accepteren",
"label": "{{name}} toelaten tot de vergadering",
"all": "Alles accepteren"
},
"deny": {
"button": "Weigeren",
"label": "{{name}} weigeren voor de vergadering",
"all": "Alles weigeren"
}
}
"lowerParticipantsHand": "Laat alle handen zakken"
},
"recording": {
"label": "Opnemen"
+1 -7
View File
@@ -75,13 +75,7 @@ export const A = ({
return (
<Link
{...props}
className={link({
size,
externalIcon,
underline,
footer,
color,
})}
className={link({ size, externalIcon, underline, footer, color })}
/>
)
}
-2
View File
@@ -218,10 +218,8 @@ export const Field = <T extends object>({
{item.description && (
<Text
variant="note"
wrap={'pretty'}
className={css({
textStyle: 'sm',
marginBottom: '0.5rem',
})}
>
{item.description}