Revision history for CallsignLookupAction


Revision [23437]

Last edited on 2016-05-20 07:38:48 by BrianKoontz [Replaces old-style internal links with new pipe-split links.]
Additions:
~1) Download the [[http://wireless.fcc.gov/uls/index.htm?job=transaction&page=weekly | FCC weekly database]] (the "Licenses" link under "Amateur Radio Service" on the right sidebar).
Deletions:
~1) Download the [[http://wireless.fcc.gov/uls/index.htm?job=transaction&page=weekly FCC weekly database]] (the "Licenses" link under "Amateur Radio Service" on the right sidebar).


Revision [20948]

Edited on 2009-11-17 20:17:39 by BrianKoontz [Initial draft]
Additions:
=====Callsign Lookup Action=====
##""{{callsignlookup}}""##
Deletions:
=====CallsignLookup Action=====
##{{callsignlookup}}##


Revision [20947]

Edited on 2009-11-17 20:16:18 by BrianKoontz [Initial draft]
Additions:
===Usage===
##{{callsignlookup}}##
/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public Licence for more details:
*
* http://www.gnu.org/copyleft/gpl.html
*
* @author {@link http://wikkawiki.org/BrianKoontz Brian Koontz} <brian@pongonova.net>
* @copyright Copyright (c) 2009, Brian Koontz <brian@wikkawiki.org>
* @name CallsignLookupAction
* @package Actions
* @license http://www.gnu.org/copyleft/gpl.html
* @since Wikka 1.2
*/
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public Licence for more details:
# http://www.gnu.org/copyleft/gpl.html
# Author: Brian Koontz <brian@wikkawiki.org>, Copyright 2009


Revision [20946]

Edited on 2009-11-17 20:09:50 by BrianKoontz [Initial draft]
Additions:
=====CallsignLookup Action=====
~-Documentation: CallsignLookupActionInfo
~-Since: Wikka 1.2p1
>>This is the development page for the callsign lookup action.::c::
A front-end that performs lookups of U.S. amateur radio callsigns against the FCC database. This action requires a local DB copy of the FCC amateur radio callsign database (files are available from the FCC; see below for instructions).
===Screenshot===
<<
{{image url="images/callsignlookup.jpg" alt="CallsignLookup action screenshot" title="CallsignLookup action screenshot"}}
<<::c::
===Code===
Save the following as ##plugins/actions/callsignlookup.php##:
if(isset($_POST['callsign']))
{
$callsign = strtoupper($this->GetSafeVar('callsign', 'post'));
$query = "
SELECT callsign, operator_class, previous_callsign, grant_date, expired_date, cancellation_date, effective_date, last_action_date, entity_name, first_name, mi, last_name, suffix, street_address, city, state, zip_code, po_box
FROM am_db.AM INNER JOIN
(am_db.HD INNER JOIN am_db.EN ON
am_db.HD.unique_system_identifier=am_db.EN.unique_system_identifier)
ON am_db.AM.unique_system_identifier=am_db.EN.unique_system_identifier
WHERE am_db.AM.callsign='".mysql_real_escape_string($callsign)."'";
if($records = $this->LoadAll($query))
{
foreach($records as $record)
{
if(!empty($record['cancellation_date']))
{
continue;
}
$operator_class = $record['operator_class'];
if(!empty($operator_class))
{
switch($operator_class)
{
case 'A': $operator_class = "ADVANCED"; break;
case 'E': $operator_class = "EXTRA"; break;
case 'G': $operator_class = "GENERAL"; break;
case 'N': $operator_class = "NOVICE"; break;
case 'P': $operator_class = "TECH PLUS"; break;
case 'T': $operator_class = "TECHNICIAN"; break;
default: $operator_class = "UNKNOWN";
}
}
$previous_callsign = $record['previous_callsign'];
$grant_date = $record['grant_date'];
$expired_date = $record['expired_date'];
$cancellation_date = $record['cancellation_date'];
$effective_date = $record['effective_date'];
$last_action_date = $record['last_action_date'];
$entity_name = $record['entity_name'];
$first_name = $record['first_name'];
$mi = $record['mi'];
$last_name = $record['last_name'];
$suffix = $record['suffix'];
$street_address = $record['street_address'];
$city = $record['city'];
$state = $record['state'];
$zip_code = $record['zip_code'];
$po_box = $record['po_box'];
}
}
else
{
$callsign_error = "<div style=\"color:red\">Callsign not found</div>";
}
<?php echo $this->FormOpen('callsignlookup', 'post'); ?>
Callsign: <input type="text" name="callsign" value="<?php echo $callsign; ?>" size="10" maxlength="10"/>
<input type="submit" name="submit" value="Search"/>
<br/>
<?php echo $callsign_error; ?>
<?php echo $this->FormClose(); ?>
<br/><br/>
<table>
<tr>
<td>Call</td>
<td>Class</td>
<td>Previous Call</td>
</tr>
<tr>
<td><div style="font-size:150%"><?php echo $callsign; ?></div></td>
<td><div style="font-weight:bold"><?php echo $operator_class; ?></td>
<td><div style="font-size:150%"><?php echo $previous_callsign; ?></div></td>
</tr>
<tr>
<td colspan="4">Entity Name</td>
</tr>
<tr>
<td colspan="4"><div style="font-size:150%"><?php echo $entity_name; ?></div></td>
</tr>
<tr>
<td>Name: </td>
<td colspan="3"><div style="font-weight:bold"><?php echo $first_name." ".$mi." ".$last_name." ".$suffix; ?></div></td>
</tr>
<tr>
<td>Address: </td>
<td colspan="3"><div style="font-weight:bold"><?php echo $street_address; ?></div></td>
</tr>
<tr>
<td>P.O. Box: </td>
<td colspan="3"><div style="font-weight:bold"><?php echo $po_box; ?></div></td>
</tr>
<tr>
<td>City: </td>
<td colspan="3"><div style="font-weight:bold"><?php echo $city; ?></div></td>
</tr>
<tr>
<td>State: </td>
<td><div style="font-weight:bold"><?php echo $state; ?></div></td>
<td>Zip Code: </td>
<td><div style="font-weight:bold"><?php echo $zip_code; ?></div></td>
</tr>
<tr>
<td>Grant Date: </td>
<td><div style="font-weight:bold"><?php echo $grant_date; ?></div></td>
<td>Effective Date:</td>
<td><div style="font-weight:bold"><?php echo $effective_date; ?></div></td>
</tr>
<tr>
<td>Expired Date: </td>
<td><div style="font-weight:bold"><?php echo $expired_date; ?></div></td>
</tr>
<tr>
<td>Cancel Date: </td>
<td><div style="font-weight:bold"><?php echo $cancellation_date; ?></div></td>
<td>Last Action Date: </td>
<td><div style="font-weight:bold"><?php echo $last_action_date; ?></div></td>
</tr>
</table>
===Setting up the database===
~1) Download the [[http://wireless.fcc.gov/uls/index.htm?job=transaction&page=weekly FCC weekly database]] (the "Licenses" link under "Amateur Radio Service" on the right sidebar).
~1) Only certain tables (AM, EN, HD) are used for this action. I've posted a perl script that performs the necessary table and field creations. If you choose to roll your own, read the comments at the start of the script for the fields that are required.
~1) To populate the database, create a new MySQL database, and modify the "DB access" parameters in the script below accordingly. Copy this perl script into the directory into which you extracted the DB files, and run. (//Note: This will take a while...it took about 1/2 hour on my 733MHz iBook.//)
%%(perl)
#! /usr/bin/perl
#
# populateDB.pl - Populate various tables with ham radio callsign DB
# data. The following tables and fields must be defined:
#
# table AM
# unique_system_identifier numeric(9,0) not null,
# callsign char(10) null,
# operator_class char(1) null,
# trustee_callsign char(10) null,
# trustee_indicator char(1) null,
# previous_callsign char(10) null,
# trustee_name varchar(50) null
#
# table EN
# unique_system_identifier numeric(9,0) not null,
# entity_name varchar(200) null,
# first_name varchar(20) null,
# mi char(1) null,
# last_name varchar(20) null,
# suffix char(3) null,
# email varchar(50) null,
# street_address varchar(60) null,
# city varchar(20) null,
# state char(2) null,
# zip_code char(9) null,
# po_box varchar(20) null,
#
# table HD
# unique_system_identifier numeric(9,0) not null,
# license_status char(1) null,
# grant_date char(10) null,
# expired_date char(10) null,
# cancellation_date char(10) null,
# effective_date char(10) null,
# last_action_date char(10) null,
#####################################################################
use strict;
use DBI();
### Modify these ###
# DB access #
my $am_database = "am_db";
my $am_host = "127.0.0.1";
my $am_username = "root";
my $am_password = "root";
my $RaiseError = 1;
### End modifications ###
my $dbh = DBI->connect("DBI:mysql:database=$am_database; host=$am_host",
"$am_username", "$am_password",
{'RaiseError' => $RaiseError});
# Create tables
$dbh->do("CREATE TABLE IF NOT EXISTS AM (
unique_system_identifier numeric(9,0) not null,
callsign char(10) null,
operator_class char(1) null,
trustee_callsign char(10) null,
trustee_indicator char(1) null,
previous_callsign char(10) null,
trustee_name varchar(50) null,
PRIMARY KEY (unique_system_identifier))
TYPE=MyISAM");
$dbh->do("CREATE TABLE IF NOT EXISTS EN (
unique_system_identifier numeric(9,0) not null,
entity_name varchar(200) null,
first_name varchar(20) null,
mi char(1) null,
last_name varchar(20) null,
suffix char(3) null,
email varchar(50) null,
street_address varchar(60) null,
city varchar(20) null,
state char(2) null,
zip_code char(9) null,
po_box varchar(20) null,
PRIMARY KEY (unique_system_identifier))
TYPE=MyISAM");
$dbh->do("CREATE TABLE IF NOT EXISTS HD (
unique_system_identifier numeric(9,0) not null,
license_status char(1) null,
grant_date char(10) null,
expired_date char(10) null,
cancellation_date char(10) null,
effective_date char(10) null,
last_action_date char(10) null,
PRIMARY KEY (unique_system_identifier))
TYPE=MyISAM");
# Populate AM table
my $table = "AM.dat";
open(IN, "<$table") or die "Can't open $table for reading!";
my $sth = $dbh->prepare("INSERT INTO AM (unique_system_identifier,
callsign,
operator_class,
trustee_callsign,
trustee_indicator,
previous_callsign,
trustee_name)
VALUES(?,?,?,?,?,?,?)");
=pod
while(<IN>)
{
chomp $_;
my($z, $a, $z, $z, $b, $c, $z, $z, $d, $e,
$z, $z, $z, $z, $z, $f, $z, $g) =
split(/\|/, $_);
$sth->execute($a, $b, $c, $d, $e, $f, $g);
=cut
close IN;
# Populate EN table
$table = "EN.dat";
open(IN, "<$table") or die "Can't open $table for reading!";
$sth = $dbh->prepare("INSERT INTO EN (unique_system_identifier,
entity_name,
first_name,
mi,
last_name,
suffix,
email,
street_address,
city,
state,
zip_code,
po_box)
VALUES(?,?,?,?,?,?,?,?,?,?,?,?)");
while(<IN>)
{
chomp $_;
my($z, $a, $z, $z, $z, $z, $z, $b, $c, $d, $e, $f, $z, $z, $g,
$h, $i, $j, $k, $l, $z) =
split(/\|/, $_);
$sth->execute($a, $b, $c, $d, $e, $f, $g, $h, $i, $j, $k, $l);
close IN;
# Populate HD table
$table = "HD.dat";
open(IN, "<$table") or die "Can't open $table for reading!";
$sth = $dbh->prepare("INSERT INTO HD (unique_system_identifier,
license_status,
grant_date,
expired_date,
cancellation_date,
effective_date,
last_action_date)
VALUES(?,?,?,?,?,?,?)");
=pod
while(<IN>)
{
chomp $_;
my($z, $a, $z, $z, $z, $b, $z, $c, $d, $e, $z, $z, $z, $z, $z, $z,
$z, $z, $z, $z, $z, $z, $z, $z, $z, $z, $z, $z, $z, $z, $z,
$z, $z, $z, $z, $z, $z, $z, $z, $z, $f, $g, $z) =
split(/\|/, $_);
$sth->execute($a, $b, $c, $d, $e, $f, $g);
close IN;
=cut
$dbh->disconnect;
Deletions:
=====Abbreviation Action=====
~-Documentation: AbbreviationActionInfo
~-Alternative approach: AcronymFormatter
>>This is the development page for the abbreviation action.::c::
The php code:
/**
* Create a <abbr> or <acronym> link.
*
* Usage: {{abbr type="acronym" short="IMHO" long="In My Humble Opinion"}}
*
* @package Actions
* @subpackage
* @name abbr
*
* @author {@link http://wikka.jsnx.com/ChristianBarthelemy Christian Barthelemy} - original idea and code.
* @version 0.1
* @since Not (yet?) part of offical Wikka release
*
* @input string $type optional: the type of abbreviation
* default is abbr any other value means acronym - will be used as the html tag and as the name of the class too
*
* @input string $short required: the short writting that needs to be explained
*
* @input string $long optional: the long text to explain the meaning of the short one
* default is empty - it assumes that it has been previously provided in the same page
*
* @todo Nothing I can think about for now.
*
*/
// set defaults
$type = "abbr";
$output = "";
// ***** PARAMETERS Interface *****
$uType = $vars['type'];
if ($uType) $type = "acronym";
$uShort = $vars['short'];
if ($uShort) $short = $uShort;
$uLong = $vars['long'];
if ($uLong) $long = $uLong;
// ***** end PARAMETERS Interface *****
// ***** HTML code generation *****
// if short parameter hasn't been provided nothing is done
if ($short) {
$output="<".$type." class=\"".$type."\" ";
if ($long) {$output.="TITLE=\"".$long."\">";}
$output.=$short."</".$type.">";
// ***** end HTML code generation *****
print $output;
The added css (example):
%%(css)
.abbr {
color: red;
cursor: hand;
.acronym {
color: red;
cursor: hand;


Revision [20945]

The oldest known version of this page was created on 2009-11-17 19:43:15 by BrianKoontz [Initial draft]
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki