feat(hamlog): mark an already-uploaded log through bulk edit
A log sent to hamlog.online by hand — an ADIF exported from OpsLog and dropped on their site — had no way of being marked as sent afterwards. The QSL Manager then listed every one of those contacts as backlog and offered to upload them a second time. Both HAMLOG keys join the bulk-editable extras, so a selection (or the whole log) can be stamped in one pass. They are DATES rather than Y/N flags because that is the shape the sent stamp already uses: the QSL Manager's backlog asks whether the key is present, and a date also says when it went. The test pins that they are reachable through the extras path and NOT offered as columns — a mapping claiming both would write to a table that has neither.
This commit is contained in:
+4
-2
@@ -9,7 +9,8 @@
|
|||||||
"A rig whose serial port is refused now says who is likely holding it — OmniRig stays resident and keeps the port of the rig configured in it, which is what a native backend then never gets. \"Serial port busy\" alone named nobody.",
|
"A rig whose serial port is refused now says who is likely holding it — OmniRig stays resident and keeps the port of the rig configured in it, which is what a native backend then never gets. \"Serial port busy\" alone named nobody.",
|
||||||
"The row colours in Appearance can be scoped to HAMLOG.online as well, alongside paper, LoTW, eQSL and QRZ.com.",
|
"The row colours in Appearance can be scoped to HAMLOG.online as well, alongside paper, LoTW, eQSL and QRZ.com.",
|
||||||
"HAMLOG.online appears in the QSL Manager too: pick it to see every QSO never sent there and upload the backlog in one go. A contact already sent carries the date it went, so a second sweep does not send it twice.",
|
"HAMLOG.online appears in the QSL Manager too: pick it to see every QSO never sent there and upload the backlog in one go. A contact already sent carries the date it went, so a second sweep does not send it twice.",
|
||||||
"Right-clicking QSOs offers HAMLOG.online among the upload targets, and the toast names each service properly instead of echoing its internal id."
|
"Right-clicking QSOs offers HAMLOG.online among the upload targets, and the toast names each service properly instead of echoing its internal id.",
|
||||||
|
"Bulk edit can set the HAMLOG.online sent and confirmed dates. A log uploaded to their site by hand had no way to be marked as sent, so OpsLog kept offering to upload every contact again."
|
||||||
],
|
],
|
||||||
"fr": [
|
"fr": [
|
||||||
"Yaesu : une ligne ANT dans le panneau du poste sélectionne la prise d'antenne, et le choix est mémorisé pour la bande sur laquelle il a été fait — on change de bande, l'antenne suit. Aucune page à configurer : choisir l'antenne une fois sur une bande le dit très bien. Les postes à une seule prise n'affichent jamais la ligne.",
|
"Yaesu : une ligne ANT dans le panneau du poste sélectionne la prise d'antenne, et le choix est mémorisé pour la bande sur laquelle il a été fait — on change de bande, l'antenne suit. Aucune page à configurer : choisir l'antenne une fois sur une bande le dit très bien. Les postes à une seule prise n'affichent jamais la ligne.",
|
||||||
@@ -18,7 +19,8 @@
|
|||||||
"Un poste dont le port série est refusé indique maintenant qui le détient vraisemblablement — OmniRig reste résident et garde le port de la radio configurée chez lui, que le backend natif n'obtient alors jamais. « Serial port busy » ne désignait personne.",
|
"Un poste dont le port série est refusé indique maintenant qui le détient vraisemblablement — OmniRig reste résident et garde le port de la radio configurée chez lui, que le backend natif n'obtient alors jamais. « Serial port busy » ne désignait personne.",
|
||||||
"Les couleurs de lignes dans Apparence peuvent aussi être limitées à HAMLOG.online, aux côtés du papier, de LoTW, d'eQSL et de QRZ.com.",
|
"Les couleurs de lignes dans Apparence peuvent aussi être limitées à HAMLOG.online, aux côtés du papier, de LoTW, d'eQSL et de QRZ.com.",
|
||||||
"HAMLOG.online figure aussi dans le gestionnaire QSL : on le choisit pour voir tous les QSO jamais envoyés là-bas et expédier l'arriéré d'un coup. Un contact déjà envoyé porte la date de son départ, donc un second passage ne le renvoie pas.",
|
"HAMLOG.online figure aussi dans le gestionnaire QSL : on le choisit pour voir tous les QSO jamais envoyés là-bas et expédier l'arriéré d'un coup. Un contact déjà envoyé porte la date de son départ, donc un second passage ne le renvoie pas.",
|
||||||
"Le clic droit sur des QSO propose HAMLOG.online parmi les destinations d'envoi, et la notification nomme correctement chaque service au lieu d'afficher son identifiant interne."
|
"Le clic droit sur des QSO propose HAMLOG.online parmi les destinations d'envoi, et la notification nomme correctement chaque service au lieu d'afficher son identifiant interne.",
|
||||||
|
"L'édition en masse peut renseigner les dates d'envoi et de confirmation HAMLOG.online. Un journal téléversé à la main sur leur site n'avait aucun moyen d'être marqué comme envoyé, et OpsLog proposait donc de renvoyer tous les contacts."
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -48,6 +48,12 @@ const FIELDS: FieldDef[] = [
|
|||||||
{ id: 'clublog_sent_date', label: 'bulk.fClublogSentDate', group: 'QSL / upload', kind: 'date' },
|
{ id: 'clublog_sent_date', label: 'bulk.fClublogSentDate', group: 'QSL / upload', kind: 'date' },
|
||||||
{ id: 'hrdlog_sent', label: 'bulk.fHrdlogSent', group: 'QSL / upload', kind: 'status' },
|
{ id: 'hrdlog_sent', label: 'bulk.fHrdlogSent', group: 'QSL / upload', kind: 'status' },
|
||||||
{ id: 'hrdlog_sent_date', label: 'bulk.fHrdlogSentDate', group: 'QSL / upload', kind: 'date' },
|
{ id: 'hrdlog_sent_date', label: 'bulk.fHrdlogSentDate', group: 'QSL / upload', kind: 'date' },
|
||||||
|
// HAMLOG.online: no promoted column, written into extras_json (see
|
||||||
|
// qso.bulkEditableExtras). Free text rather than a Y/N status because the
|
||||||
|
// value carries the DATE it went — which is what the QSL Manager's backlog
|
||||||
|
// and the row colours both read.
|
||||||
|
{ id: 'hamlog_sent', label: 'bulk.fHamlogSent', group: 'QSL / upload', kind: 'date' },
|
||||||
|
{ id: 'hamlog_rcvd', label: 'bulk.fHamlogRcvd', group: 'QSL / upload', kind: 'date' },
|
||||||
// My station / operator
|
// My station / operator
|
||||||
{ id: 'station_callsign', label: 'bulk.fStationCall', group: 'My station', kind: 'text', upper: true },
|
{ id: 'station_callsign', label: 'bulk.fStationCall', group: 'My station', kind: 'text', upper: true },
|
||||||
{ id: 'operator', label: 'bulk.fOperator', group: 'My station', kind: 'text', upper: true },
|
{ id: 'operator', label: 'bulk.fOperator', group: 'My station', kind: 'text', upper: true },
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -24,3 +24,25 @@ func TestBandIsNotBulkEditableAlone(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// A log uploaded to HAMLOG.online BY HAND has to be markable afterwards, or
|
||||||
|
// OpsLog offers to send every one of those contacts again. Both directions live
|
||||||
|
// in extras — the ADIF names a field for hamlog.EU and none for hamlog.ONLINE —
|
||||||
|
// so they must be reachable through the extras path, not the column one.
|
||||||
|
func TestHamlogFieldsAreBulkEditable(t *testing.T) {
|
||||||
|
for field, want := range map[string]string{
|
||||||
|
"hamlog_sent": "APP_OPSLOG_HAMLOG_SENT",
|
||||||
|
"hamlog_rcvd": "APP_OPSLOG_HAMLOG_QSL",
|
||||||
|
} {
|
||||||
|
if got := BulkExtraKey(field); got != want {
|
||||||
|
t.Errorf("BulkExtraKey(%q) = %q, want %q", field, got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// And they are NOT columns: a mapping that also claimed a column would write
|
||||||
|
// to a table that has none.
|
||||||
|
for _, col := range []string{"hamlog_sent", "hamlog_rcvd", "APP_OPSLOG_HAMLOG_SENT"} {
|
||||||
|
if BulkEditable(col) {
|
||||||
|
t.Errorf("%q is offered as a bulk-editable COLUMN", col)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -909,6 +909,13 @@ func (r *Repo) BulkSetField(ctx context.Context, ids []int64, column, value stri
|
|||||||
// column and there is no owner_callsign column.
|
// column and there is no owner_callsign column.
|
||||||
var bulkEditableExtras = map[string]string{
|
var bulkEditableExtras = map[string]string{
|
||||||
"owner_callsign": "OWNER_CALLSIGN",
|
"owner_callsign": "OWNER_CALLSIGN",
|
||||||
|
// HAMLOG.online has no promoted column — the ADIF standard defines a field
|
||||||
|
// for hamlog.EU and none for hamlog.ONLINE. Both directions are editable in
|
||||||
|
// bulk because a log uploaded to their site BY HAND has to be markable
|
||||||
|
// afterwards: without it OpsLog would offer to send every one of those
|
||||||
|
// contacts again.
|
||||||
|
"hamlog_sent": "APP_OPSLOG_HAMLOG_SENT",
|
||||||
|
"hamlog_rcvd": "APP_OPSLOG_HAMLOG_QSL",
|
||||||
}
|
}
|
||||||
|
|
||||||
// BulkExtraKey maps a frontend field id to its ADIF key in extras_json, or "".
|
// BulkExtraKey maps a frontend field id to its ADIF key in extras_json, or "".
|
||||||
|
|||||||
Reference in New Issue
Block a user