Skip to content

Commit 4f4617e

Browse files
authored
Merge pull request #2896 from hotosm/develop
Release candidate 4.0.4
2 parents d1a83b0 + 65a1114 commit 4f4617e

File tree

16 files changed

+111
-85
lines changed

16 files changed

+111
-85
lines changed

backend/api/projects/resources.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333

3434
class ProjectsRestAPI(Resource):
35+
@token_auth.login_required(optional=True)
3536
def get(self, project_id):
3637
"""
3738
Get a specified project including it's area
@@ -91,9 +92,9 @@ def get(self, project_id):
9192
request.environ.get("HTTP_ACCEPT_LANGUAGE"),
9293
abbreviated,
9394
)
94-
project_dto = project_dto.to_primitive()
9595

9696
if project_dto:
97+
project_dto = project_dto.to_primitive()
9798
if as_file:
9899
return send_file(
99100
io.BytesIO(geojson.dumps(project_dto).encode("utf-8")),

backend/services/messaging/smtp_service.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def send_contact_admin_email(data):
3737
if email_to is None:
3838
raise ValueError("variable TM_EMAIL_CONTACT_ADDRESS not set")
3939

40-
message = """New contact from {name} <{email}>.
40+
message = """New contact from {name} - {email}.
4141
<p>{content}</p>
4242
""".format(
4343
name=data.get("name"), email=data.get("email"), content=data.get("content"),

backend/services/project_search_service.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,14 @@ def _filter_projects(search_dto: ProjectSearchDTO):
244244

245245
if search_dto.text_search:
246246
# We construct an OR search, so any projects that contain or more of the search terms should be returned
247-
or_search = search_dto.text_search.replace(" ", " | ")
248-
247+
or_search = " | ".join(
248+
[x for x in search_dto.text_search.split(" ") if x != ""]
249+
)
249250
opts = [
250251
ProjectInfo.text_searchable.match(
251252
or_search, postgresql_regconfig="english"
252253
),
253-
ProjectInfo.name.like(f"%{search_dto.text_search}%"),
254+
ProjectInfo.name.like(f"%{or_search}%"),
254255
]
255256
try:
256257
opts.append(Project.id == int(search_dto.text_search))
@@ -285,8 +286,7 @@ def _filter_projects(search_dto: ProjectSearchDTO):
285286
)
286287
orgs_managed = [org.id for org in user_orgs_list]
287288
org_projects = query.filter(Project.organisation_id.in_(orgs_managed))
288-
my_projects = query.filter(Project.author_id == search_dto.managed_by)
289-
query = org_projects.union(team_projects).union(my_projects)
289+
query = org_projects.union(team_projects)
290290

291291
all_results = query.all()
292292
paginated_results = query.paginate(search_dto.page, 14, True)

backend/services/users/authentication_service.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
@token_auth.verify_token
1919
def verify_token(token):
2020
""" Verify the supplied token and check user role is correct for the requested resource"""
21-
21+
tm.authenticated_user_id = None
2222
if not token:
2323
current_app.logger.debug(f"Token not supplied {request.base_url}")
2424
return False

frontend/src/assets/styles/_extra.scss

+6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
max-height: 100vh;
55
overflow-y: scroll;
66
}
7+
.video-popup-content {
8+
width: 90% !important;
9+
}
710
.user-popup-content {
811
width: 70% !important;
912
left: 15% !important;
@@ -32,6 +35,9 @@
3235
.popup-content {
3336
width: 44% !important;
3437
}
38+
.video-popup-content {
39+
width: 66% !important;
40+
}
3541
.user-popup-content {
3642
width: 13% !important;
3743
}

frontend/src/components/taskSelection/imagery.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@ export function Imagery({ value = '' }: Object) {
1010
const [isCopied, setCopied] = useCopyClipboard();
1111

1212
const handleClick = () => setCopied(value);
13-
let content = <span>{value}</span>;
13+
let content = <span title={value}>{value}</span>;
1414
let copyButton;
1515
let messageId;
1616
if (value) {
17-
if (value.startsWith('tms[')) {
17+
if (value.startsWith('tms')) {
1818
messageId = 'customTMSLayer';
1919
}
20-
if (value.startsWith('wms[')) {
20+
if (value.startsWith('wms')) {
2121
messageId = 'customWMSLayer';
2222
}
23-
if (value.startsWith('wmts[')) {
23+
if (value.startsWith('wmts')) {
2424
messageId = 'customWMTSLayer';
2525
}
2626
if (value.startsWith('http') || value.startsWith('https')) {
@@ -42,7 +42,7 @@ export function Imagery({ value = '' }: Object) {
4242
content = <FormattedMessage {...messages.noImageryDefined} />;
4343
}
4444
return (
45-
<p className={`f5 fw6 pt1 ma0 ${value ? 'blue-dark' : 'blue-light'}`}>
45+
<p className={`f5 fw6 pt1 pr3 ma0 truncate ${value ? 'blue-dark' : 'blue-light'}`}>
4646
{content}
4747
{copyButton}
4848
</p>

frontend/src/components/taskSelection/tests/imagery.test.js

+10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,16 @@ it('test if Imagery returns the correct FormattedMessage to TMS', () => {
1616
expect(testInstance.findByType(FormattedMessage).props.id).toBe('project.imagery.tms');
1717
});
1818

19+
it('test if Imagery returns the correct FormattedMessage to TMS, even without the zoom level information', () => {
20+
const element = createComponentWithIntl(
21+
<Imagery
22+
value={'tms:https://service.com/earthservice/tms/Layer@EPSG:3857@jpg/{zoom}/{x}/{-y}.jpg'}
23+
/>,
24+
);
25+
const testInstance = element.root;
26+
expect(testInstance.findByType(FormattedMessage).props.id).toBe('project.imagery.tms');
27+
});
28+
1929
it('test if Imagery returns the correct FormattedMessage to WMS', () => {
2030
const element = createComponentWithIntl(
2131
<Imagery

frontend/src/locales/cs.json

+8-8
Original file line numberDiff line numberDiff line change
@@ -788,8 +788,8 @@
788788
"pages.learn.map.title": "Naučte se mapovat",
789789
"pages.learn.map.intro": "Mapování v OpenStreetMap je týmové úsilí, které neustále roste díky komunitě stovek tisíc globálních přispěvatelů. Každý se může podílet na této otevřené mapě světa a ta zas potřebuje odpovědné lidi, kteří jsou otevření k učení a měli cit k detailům.",
790790
"pages.learn.map.description": "Nyní můžete začít svou mapovací cestu. Před přidáním nebo úpravou existujících dat nemusíte vyžadovat povolení. Pokud si myslíte, že můžete něco vylepšit, udělejte to. Ale vždy pamatujte, s velkou mocí přichází velká odpovědnost.",
791-
"pages.learn.videos.title": "",
792-
"pages.learn.manuals.title": "",
791+
"pages.learn.videos.title": "Videa",
792+
"pages.learn.manuals.title": "Příručky",
793793
"pages.learn.tutorials.quick_start.title": "Rychlý návod",
794794
"pages.learn.tutorials.quick_start.description": "Pokyny krok za krokem vám umožní mapovat co nejrychleji.",
795795
"pages.learn.tutorials.tm_manual.title": "Uživatelská příručka Tasking Manageru",
@@ -804,12 +804,12 @@
804804
"pages.learn.map.steps.task.description": "Projekty jsou rozděleny do sady úloh, které lze zvládnout co do velikosti a přizpůsobit vaší úrovni dovedností",
805805
"pages.learn.map.steps.map.title": "Mapujte prostřednictvím OpenStreetMap",
806806
"pages.learn.map.steps.map.description": "Pokud jste v mapování nováčkem, doporučujeme před zahájením mapování zkontrolovat níže uvedené příručky.",
807-
"pages.learn.videos.signup.title": "",
808-
"pages.learn.videos.signup.description": "",
809-
"pages.learn.videos.map_roads.title": "",
810-
"pages.learn.videos.map_roads.description": "",
811-
"pages.learn.videos.map_buildings.title": "",
812-
"pages.learn.videos.map_buildings.description": "",
807+
"pages.learn.videos.signup.title": "Zaregistrujte se do Tasking Manageru",
808+
"pages.learn.videos.signup.description": "Naučte se, jak se přihlásit do Tasking Manageru.",
809+
"pages.learn.videos.map_roads.title": "Mapování cest",
810+
"pages.learn.videos.map_roads.description": "Naučte se, jak mapovat cesty na OpenStreetMap.",
811+
"pages.learn.videos.map_buildings.title": "Vyberte úlohu a mapujte budovy",
812+
"pages.learn.videos.map_buildings.description": "Naučte se, jak mapovat budovy na OpenStreetMap.",
813813
"pages.learn.validate_title": "Naučte se validovat",
814814
"pages.learn.validate.intro": "Validace je důležitou součástí procesu. Vyžaduje důvěru ve vaše mapovací schopnosti a ochotu pomoci koučovat a radit novějším mapovačům.",
815815
"pages.learn.validate.description": "Získání druhého, třetího nebo čtvrtého páru očí na mapované funkce je důležitým krokem k zajištění kvality dat přidávaných do OpenStreetMap a jejich použití po celém světě.",

0 commit comments

Comments
 (0)