🐛 Fix import not updating categories, Fix import not updating user settings
This commit is contained in:
parent
5a7c58241c
commit
d3292f1430
@ -80,12 +80,12 @@ def export_data(session: SessionDep, current_user: Annotated[str, Depends(get_cu
|
|||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
@router.post("/import", response_model=list[PlaceRead])
|
@router.post("/import")
|
||||||
async def import_data(
|
async def import_data(
|
||||||
session: SessionDep,
|
session: SessionDep,
|
||||||
current_user: Annotated[str, Depends(get_current_username)],
|
current_user: Annotated[str, Depends(get_current_username)],
|
||||||
file: UploadFile = File(...),
|
file: UploadFile = File(...),
|
||||||
) -> list[PlaceRead]:
|
):
|
||||||
if file.content_type != "application/json":
|
if file.content_type != "application/json":
|
||||||
raise HTTPException(status_code=415, detail="File must be a JSON file")
|
raise HTTPException(status_code=415, detail="File must be a JSON file")
|
||||||
|
|
||||||
@ -107,7 +107,7 @@ async def import_data(
|
|||||||
|
|
||||||
# Handle image update
|
# Handle image update
|
||||||
if category.get("image_id"):
|
if category.get("image_id"):
|
||||||
b64_image = category.get("images", {}).get(str(category.get("image_id")))
|
b64_image = data.get("images", {}).get(str(category.get("image_id")))
|
||||||
if b64_image:
|
if b64_image:
|
||||||
image_bytes = b64img_decode(b64_image)
|
image_bytes = b64img_decode(b64_image)
|
||||||
filename = save_image_to_file(image_bytes, settings.PLACE_IMAGE_SIZE)
|
filename = save_image_to_file(image_bytes, settings.PLACE_IMAGE_SIZE)
|
||||||
@ -144,7 +144,7 @@ async def import_data(
|
|||||||
category_data["user"] = current_user
|
category_data["user"] = current_user
|
||||||
|
|
||||||
if category.get("image_id"):
|
if category.get("image_id"):
|
||||||
b64_image = category.get("images", {}).get(str(category.get("image_id")))
|
b64_image = data.get("images", {}).get(str(category.get("image_id")))
|
||||||
if b64_image is None:
|
if b64_image is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -205,16 +205,32 @@ async def import_data(
|
|||||||
db_user = session.get(User, current_user)
|
db_user = session.get(User, current_user)
|
||||||
if data.get("settings"):
|
if data.get("settings"):
|
||||||
settings_data = data["settings"]
|
settings_data = data["settings"]
|
||||||
if settings_data.get("map_lat"):
|
if "map_lat" in settings_data:
|
||||||
db_user.map_lat = settings_data["map_lat"]
|
db_user.map_lat = settings_data["map_lat"]
|
||||||
|
|
||||||
if settings_data.get("map_lng"):
|
if "map_lng" in settings_data:
|
||||||
db_user.map_lng = settings_data["map_lng"]
|
db_user.map_lng = settings_data["map_lng"]
|
||||||
|
|
||||||
if settings_data.get("currency"):
|
if "currency" in settings_data:
|
||||||
db_user.currency = settings_data["currency"]
|
db_user.currency = settings_data["currency"]
|
||||||
|
|
||||||
|
if "tile_layer" in settings_data:
|
||||||
|
db_user.tile_layer = settings_data["tile_layer"]
|
||||||
|
|
||||||
|
if "do_not_display" in settings_data:
|
||||||
|
db_user.do_not_display = ",".join(settings_data["do_not_display"])
|
||||||
|
|
||||||
|
if "mode_low_network" in settings_data:
|
||||||
|
db_user.mode_low_network = settings_data["mode_low_network"]
|
||||||
|
|
||||||
|
if "mode_dark" in settings_data:
|
||||||
|
db_user.mode_dark = settings_data["mode_dark"]
|
||||||
|
|
||||||
|
if "mode_gpx_in_place" in settings_data:
|
||||||
|
db_user.mode_gpx_in_place = settings_data["mode_gpx_in_place"]
|
||||||
|
|
||||||
session.add(db_user)
|
session.add(db_user)
|
||||||
|
session.flush()
|
||||||
session.refresh(db_user)
|
session.refresh(db_user)
|
||||||
|
|
||||||
trip_place_id_map = {p["id"]: new_p.id for p, new_p in zip(data.get("places", []), places)}
|
trip_place_id_map = {p["id"]: new_p.id for p, new_p in zip(data.get("places", []), places)}
|
||||||
@ -271,4 +287,11 @@ async def import_data(
|
|||||||
session.add(trip_item)
|
session.add(trip_item)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
return [PlaceRead.serialize(p) for p in places]
|
return {
|
||||||
|
"places": [PlaceRead.serialize(p) for p in places],
|
||||||
|
"categories": [
|
||||||
|
CategoryRead.serialize(c)
|
||||||
|
for c in session.exec(select(Category).filter(Category.user == current_user))
|
||||||
|
],
|
||||||
|
"settings": UserRead.serialize(session.get(User, current_user)),
|
||||||
|
}
|
||||||
|
|||||||
@ -617,13 +617,24 @@ export class DashboardComponent implements OnInit, AfterViewInit {
|
|||||||
.settingsUserImport(formdata)
|
.settingsUserImport(formdata)
|
||||||
.pipe(take(1))
|
.pipe(take(1))
|
||||||
.subscribe({
|
.subscribe({
|
||||||
next: (places) => {
|
next: (resp) => {
|
||||||
this.places = [...this.places, ...places].sort((a, b) =>
|
this.places = [...this.places, ...resp.places].sort((a, b) =>
|
||||||
a.name.localeCompare(b.name),
|
a.name.localeCompare(b.name),
|
||||||
);
|
);
|
||||||
setTimeout(() => {
|
|
||||||
|
this.categories = resp.categories;
|
||||||
|
this.activeCategories = new Set(resp.categories.map((c) => c.name));
|
||||||
|
|
||||||
|
this.settings = resp.settings;
|
||||||
|
this.isLowNet = !!resp.settings.mode_low_network;
|
||||||
|
this.isDarkMode = !!resp.settings.mode_dark;
|
||||||
|
this.isGpxInPlaceMode = !!resp.settings.mode_gpx_in_place;
|
||||||
|
if (this.isDarkMode) this.utilsService.toggleDarkMode();
|
||||||
|
this.resetFilters();
|
||||||
|
|
||||||
|
this.map?.remove();
|
||||||
|
this.initMap();
|
||||||
this.updateMarkersAndClusters();
|
this.updateMarkersAndClusters();
|
||||||
}, 10);
|
|
||||||
this.viewSettings = false;
|
this.viewSettings = false;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@ -3,7 +3,7 @@ import { HttpClient } from "@angular/common/http";
|
|||||||
import { Category, Place } from "../types/poi";
|
import { Category, Place } from "../types/poi";
|
||||||
import { BehaviorSubject, Observable, tap } from "rxjs";
|
import { BehaviorSubject, Observable, tap } from "rxjs";
|
||||||
import { Info } from "../types/info";
|
import { Info } from "../types/info";
|
||||||
import { Settings } from "../types/settings";
|
import { ImportResponse, Settings } from "../types/settings";
|
||||||
import { Trip, TripBase, TripDay, TripItem } from "../types/trip";
|
import { Trip, TripBase, TripDay, TripItem } from "../types/trip";
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
@ -220,12 +220,21 @@ export class ApiService {
|
|||||||
return this.httpClient.get<any>(`${this.apiBaseUrl}/settings/export`);
|
return this.httpClient.get<any>(`${this.apiBaseUrl}/settings/export`);
|
||||||
}
|
}
|
||||||
|
|
||||||
settingsUserImport(formdata: FormData): Observable<Place[]> {
|
settingsUserImport(formdata: FormData): Observable<ImportResponse> {
|
||||||
const headers = { enctype: "multipart/form-data" };
|
const headers = { enctype: "multipart/form-data" };
|
||||||
return this.httpClient.post<Place[]>(
|
return this.httpClient
|
||||||
`${this.apiBaseUrl}/settings/import`,
|
.post<ImportResponse>(`${this.apiBaseUrl}/settings/import`, formdata, {
|
||||||
formdata,
|
headers: headers,
|
||||||
{ headers: headers },
|
})
|
||||||
|
.pipe(
|
||||||
|
tap((resp) => {
|
||||||
|
if (resp.categories) {
|
||||||
|
this._categoriesSubjectNext(resp.categories);
|
||||||
|
}
|
||||||
|
if (resp.settings) {
|
||||||
|
this.settingsSubject.next(resp.settings);
|
||||||
|
}
|
||||||
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { Category, Place } from "./poi";
|
||||||
|
|
||||||
export interface Settings {
|
export interface Settings {
|
||||||
username: string;
|
username: string;
|
||||||
map_lat: number;
|
map_lat: number;
|
||||||
@ -9,3 +11,9 @@ export interface Settings {
|
|||||||
mode_dark?: boolean;
|
mode_dark?: boolean;
|
||||||
mode_gpx_in_place?: boolean;
|
mode_gpx_in_place?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ImportResponse {
|
||||||
|
places: Place[];
|
||||||
|
categories: Category[];
|
||||||
|
settings: Settings;
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user